班级Property
为abstract
我有以下方法:
private IPortionOfPropertyInfoAddEditView<T> getPropertyEditPortion<T>(T property) where T : Property { /*details unimportant*/ }
Property P = PropertyFactoryMethod.GetSomePropertyInstance();
var PropertyInfoPortion = getPropertyEditPortion(P);
当我以这种方式调用方法时,推断的类型是Property,而不是派生的Well
或RealEstate
,可能是因为类型推断是在编译时完成的。我通过将P转换为dynamic
来解决这个问题,例如:
var PropertyInfoPortion = getPropertyEditPortion((dynamic)P);
工作正常。我只是想知道是否有更优雅的方法来做到这一点。
修改
抱歉,我总是尝试显示最少量的代码以获得重点,以免事情变得过于混乱。这是完整的方法:
private IPortionOfPropertyInfoAddEditView<T> getPropertyEditPortion<T>(T property) where T : Property {
return StructureMap.ObjectFactory.GetInstance<IPortionOfPropertyInfoAddEditView<T>>();
}
我有一个Property实例(它是抽象的),我使用类型推断来获取传递给我的IoC的真实类型,而不必求助于反射(将正确的泛型类型放在一起)。我只是想知道是否有一个技巧可以在没有dynamic
投射的情况下完成,但我猜不是。谢谢大家。
编辑2
我正在尝试创建IPortionOfPropertyInfoAddEditView<T>
My Property实例P是IPortionOfPropertyInfoAddEditView需要的类型,但它的类型为Property,而不是更多的派生类型。如果我能说,我会喜欢它:
StructureMap.ObjectFactory.GetInstance<IPortionOfPropertyInfoAddEditView<typeof(P)>>()
但显然不允许这样做。我认为使用动态演员的类型推断将是下一个最好的事情,我只是想知道是否有人有更好的方法。对不起,从一开始就不清楚!
答案 0 :(得分:5)
没有办法用泛型来做,因为泛型总是对静态类型的值进行操作。您通过使用运行时机制(dynamic
)来解决这个问题的事实是一个很好的暗示。
有许多良好的运行时解决方案,但这取决于您对property
的确切要求(即,您要访问的成员,所述成员的可见性等)。
答案 1 :(得分:2)
首先想到的是将getPropertyEditPortion
类的方法实现为Property
。
然后,在这种情况下,你不需要关心P
的派生类型是什么,只需调用你的方法,就可以运行正确的实现。
如果这不可行,那么使用dynamic
关键字似乎是合适的。