Подтвердить что ты не робот

Есть ли способ вернуть Анонимный тип из метода?

Я знаю, что не могу написать такой метод, как:

public var MyMethod()
{
   return new{ Property1 = "test", Property2="test"};
}

Я могу сделать это иначе:

public object MyMethod()
{
   return new{ Property1 = "test", Property2="test"}
}

но я не хочу делать второй вариант, потому что, если я это сделаю, мне придется использовать отражение.


Почему я хочу это сделать:

Сегодня у меня есть метод внутри моей страницы aspx, который возвращает возвращаемый datatable результат, и я не могу его изменить. Я пытался преобразовать этот DataTable в анонимный метод со свойствами, которые я хочу работать с. Я не хотел создавать класс только для этого, и поскольку мне нужно будет выполнить один и тот же запрос более одного раза, я думал, что создать метод, который возвращает анонимный тип, будет хорошей идеей.

4b9b3361

Ответ 1

Возврат его как System.Object - единственный способ вернуть анонимный тип из метода. К сожалению, нет другого способа сделать это, поскольку анонимные типы были специально разработаны для предотвращения их использования таким образом.

Есть несколько трюков, которые вы можете сделать в связи с возвратом Object, которые позволят вам приблизиться. Если вы заинтересованы в этом обходном пути, пожалуйста, прочитайте Невозможно вернуть анонимный тип из метода? В самом деле?.

Отказ от ответственности: Несмотря на то, что связанная статья действительно показывает обходное решение, это не значит, что это хорошая идея. Я бы решительно отговаривал вас использовать этот подход, когда создание обычного типа было бы более безопасным и понятным.

Ответ 2

Кроме того, вы можете использовать класс Tuple в .NET 4.0 и выше:

http://msdn.microsoft.com/en-us/library/system.tuple(v=vs.110).aspx

Tuple<string, string> Create()
{
return Tuple.Create("test1", "test2");
} 

то вы можете получить доступ к следующим свойствам:

var result = Create();
result.Item1;
result.Item2;

Ответ 3

Самое простое решение - создать класс, вставить значения в свойство и затем вернуть его. Если анонимные типы усложняют жизнь, вы не используете их правильно.

Ответ 4

public object MyMethod() 
{
    return new
    {
         Property1 = "test",
        Property2 = "test"
     };
}

static void Main(..)
{
    dynamic o = MyMethod();  
    var p1 = o.Property1;
    var p2 = o.Property2;
}

Ответ 5

Несмотря на предупреждения о том, является ли это хорошей идеей или нет... A dynamic, похоже, отлично подходит для частного метода.

private dynamic MyMethod()
{
   return new { Property1 = "test", Property2 = "test" }
}

Ответ 6

Я думаю, что Эндрю Харе прав, вам нужно просто вернуть "объект". Для редакционного комментария я чувствую, что обращение с необработанными объектами в коде OO может быть "запахом кода". Бывают случаи, когда это правильно, но большую часть времени вам было бы лучше определить интерфейс для возврата или использовать какой-то тип базового класса, если вы собираетесь возвращать связанные типы.

Ответ 7

Нет, анонимные типы не могут существовать вне контекста, в котором они созданы, и в результате не могут использоваться как возвращаемый тип метода. Вы можете вернуть экземпляр как object, но гораздо лучше создать явный тип контейнера для этой цели.

Ответ 8

Нет, нет поддержки для расширения области анонимного класса вне метода. Вне метода класс действительно анонимный, и отражение - единственный способ получить к нему доступ.

Ответ 9

Извините, вы действительно не должны этого делать. Вы можете взломать его с помощью отражения или создать универсальный метод помощника, чтобы вернуть вам тип, но это действительно работает против языка. Просто объявите тип, чтобы он понял, что происходит.