将匿名结构定义为方法中的参数

时间:2009-11-25 10:17:50

标签: c# generics

我可以在参数声明中将对象结构定义为方法的参数,而无需创建类型吗?

我受到LINQ to SQL查询的启发,您可以以新对象的形式返回查询结果的子集:

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

4 个答案:

答案 0 :(得分:1)

不,您不能将匿名类型声明为输入参数,除非将其作为对象返回,否则无法返回它。如果你愿意的话,请参阅this blog post以获得一个hacky变通方法,但是这仍然只是来回装箱和拆箱类型,所以它实际上并不比将其视为对象更好。

答案 1 :(得分:1)

答案 2 :(得分:1)

你所描述的是不可能的。对于Linq to Sql查询,C#编译器创建一个匿名类型,其中包含一个名为Foo的属性,其类型与t.column相同。然后使用类型推理,变量“query”实际上是强类型的匿名类型(这使得你对这个变量有智能感知)。

使用“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));
    }
}

为您提供了一种“基本”能力,可以将匿名类型(或任何类型)用作参数。

答案 3 :(得分:0)

对于不能直接使用的函数的参数有多大用处?函数参数应该有助于记录函数。