我试图识别匿名类型的类型。
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);
}
现在我想将一部分代码转移到一个函数,但是它尖叫他不知道类型 - 这是合乎逻辑的,因为var在编译时是已知的并且他在编译时不知道类型:
我不想要使用动态||元组。
并且如您所知,var作为func param类型是不可接受的。
但是,我曾读过有一个trick
,可让我转移到myFunc
anonymous type
。
我认为这是由Jon双向飞碟或Eric lippert。
帮助?
答案 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
}