var的类型(不使用动态)?

时间:2012-02-01 11:00:15

标签: c# .net anonymous-types var

  

可能重复:
  How can I pass an anonymous type to a method?

我试图识别匿名类型的类型。

List<int> lst = new List<int> {1, 2, 3, 4, 5};

var myVarType = from item in lst select new {P = item*item, P2 = item + "###"};

foreach (var k in myVarType)
        {
            Console.WriteLine(k.P + "     " + k.P2);
        }

enter image description here

现在我想将一部分代码转移到一个函数,但是它尖叫他不知道类型 - 这是合乎逻辑的,因为var在编译时是已知的并且他在编译时不知道类型:

enter image description here

想要使用动态||元组。

并且如您所知,var作为func param类型是不可接受的。

但是,我曾读过有一个trick,可让我转移到myFunc anonymous type

我认为这是由Jon双向飞碟或Eric lippert。

帮助?

修改

看看我自己的答案。 我在这里找到了 What's the return type of an anonymous class

3 个答案:

答案 0 :(得分:2)

类型是'生成',您可以在运行时使用反射获取它,但它将包含您不能在名称中使用的字符。

你可以使用元组:

 select new Tuple<int,string> ( item*item,  item + "###");

答案 1 :(得分:1)

使方法通用,这应该有效。

static void MyFunc<T>(IEnumerable<T> myVarType) ...

修改

如评论中所述,您无法访问这些属性。您可以在此处使用委托来访问属性或使用动态(您不想使用它)。

static void MyFunc<T>(IEnumerable<T> myVarType, Func<T, Object[]> argumentCreator)
{
    Console.WriteLine("{0} {1}", argumentCreator(myVarType));
}

答案 2 :(得分:1)

这是我找到的代码

What's the return type of an anonymous class

static T CastByExample<T>(object source, T example) where T : class
{
    return source as T;
}

static object ReturnsAnonymous() { return new { X = 123 }; }

static void DoIt()
{
    object obj = ReturnsAnonymous();
    var example = new { X = 0 };
    var anon = CastByExample(obj, example);
    Console.WriteLine(anon.X); // 123
}