Есть ли способ вернуть Анонимный тип из метода?
Я знаю, что не могу написать такой метод, как:
public var MyMethod()
{
return new{ Property1 = "test", Property2="test"};
}
Я могу сделать это иначе:
public object MyMethod()
{
return new{ Property1 = "test", Property2="test"}
}
но я не хочу делать второй вариант, потому что, если я это сделаю, мне придется использовать отражение.
Почему я хочу это сделать:
Сегодня у меня есть метод внутри моей страницы aspx, который возвращает возвращаемый datatable результат, и я не могу его изменить. Я пытался преобразовать этот DataTable в анонимный метод со свойствами, которые я хочу работать с. Я не хотел создавать класс только для этого, и поскольку мне нужно будет выполнить один и тот же запрос более одного раза, я думал, что создать метод, который возвращает анонимный тип, будет хорошей идеей.
Ответы
Ответ 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
Извините, вы действительно не должны этого делать. Вы можете взломать его с помощью отражения или создать универсальный метод помощника, чтобы вернуть вам тип, но это действительно работает против языка. Просто объявите тип, чтобы он понял, что происходит.