2009-11-25 5 views
0

Могу ли я определить объектную структуру как параметр метода в объявлении параметра без необходимости создания типа?Определить анонимную структуру как параметр в методе

Я вдохновлен LINQ для запросов SQL, где вы в состоянии вернуть подмножество ваших запросов результатов в виде нового объекта:

var query = from t in dc.Table select new { Foo = t.column }; 

ответ

1

То, что вы описываете, это не представляется возможным. В случае вашего запроса Linq to Sql компилятор C# создает анонимный тип с единственным свойством Foo с тем же типом, что и t.column. Затем используется метод inferencing, и переменная «query» на самом деле строго типизирована для этого анонимного типа (что и дает вам свойство intellisense для этой переменной).

Использование «var» в качестве типа параметра невозможно, поскольку тип параметра не может быть выведен, он требует, чтобы вызывающее выражение определяло фактический тип параметра.

Самое лучшее, что вы могли бы сделать, чтобы использовать дженерики и перебирать свойства:

public static void Print<T>(T obj) 
{ 
    Type type = typeof(T); 
    PropertyInfo[] properties = type.GetProperties(); 
    foreach(PropertyInfo pi in properties) 
    { 
     Console.WriteLine(pi.Name + ": " + pi.GetValue(obj, null)); 
    } 
} 

, который дает вам «элементарную» способность использовать анонимные типы (или любой тип по этому вопросу) в качестве параметра ,

1

Нет, вы не можете объявить анонимный тип, входной параметр, и вы не можете его вернуть, если только вы не вернете его как объект. См. this blog post для хакерского обходного пути, если вы хотите, но это действительно по-прежнему просто бокс и распаковка типа туда и обратно, поэтому на самом деле это не лучше, чем просто рассматривать его как объект.

0

Насколько полезен параметр для функции, которую вы не можете использовать напрямую? Функциональные параметры должны помочь документировать функцию.

Смежные вопросы