2014-01-15 978 views
1

我正在枚举我的EntityFramework容器属性。通过反思,我只获得DbSet属性。现在我需要访问属性值,我想这样说:C#强制类型转换为泛型强类型

object obj = PropertyInfo.GetValue(myobject) 

所有在这里,但我需要转换为它的实际类型(我非常需要这个):

DbSet<MyRealType> obj = (DbSet<MyRealType>)PropertyInfo.GetValue(myobject); 

MyRealType在编译时是未知的。我只得到Type,但我可以将它投射到 DbSet<MyrealType>。这有可能实现吗?

+2

请加上语言标记。 –

回答

1

不,这将是不可能的。你试图做的是将运行时类型转换为编译时类型,许多程序员尝试并且未能这样做。此时你的选择主要涉及用反射来检查类型,并试图通过反射来调用那个人的方法和属性。

您的其他选项是将值转换为dynamic,然后尝试(并希望)您的调用按预期工作。在您的情况

所以,你最好的选择将是可能使用动态类型:

dynamic obj = Propertyinfo.GetValue(myobject); 
obj.SomeMethodYouWantToCall(); // and catch DLR errors 
+0

我尝试了动态的方式,但它看起来像扩展方法不会被调用(实际上它似乎很明显)。不管怎样,谢谢你。 – sam

+1

您仍然可以从动态对象中调用扩展方法,这只是更多的工作。 IE:'EnumerableExtensions.Select(obj,x => x.SomeProperty)'通常为'obj.Select(x => x.SomeProperty)''。扩展方法只是语法糖= D – Tejs