Ada*_*kis 4 c# generics type-inference
上课Property是abstract
我有以下方法:
private IPortionOfPropertyInfoAddEditView<T> getPropertyEditPortion<T>(T property) where T : Property { /*details unimportant*/ }
Property P = PropertyFactoryMethod.GetSomePropertyInstance();
var PropertyInfoPortion = getPropertyEditPortion(P);
Run Code Online (Sandbox Code Playgroud)
当我以这种方式调用方法时,推断的类型是Property,而不是派生的更多Well,或者RealEstate,可能是因为类型推断是在编译时完成的.我通过将P转换为来解决这个问题dynamic,例如:
var PropertyInfoPortion = getPropertyEditPortion((dynamic)P);
Run Code Online (Sandbox Code Playgroud)
哪个工作正常.我只是想知道是否有更优雅的方式来做到这一点.
编辑
对不起,我总是尝试显示最少量的代码以获得重点,以免事情变得太杂乱.这是完整的方法:
private IPortionOfPropertyInfoAddEditView<T> getPropertyEditPortion<T>(T property) where T : Property {
return StructureMap.ObjectFactory.GetInstance<IPortionOfPropertyInfoAddEditView<T>>();
}
Run Code Online (Sandbox Code Playgroud)
我有一个Property实例(它是抽象的),我使用类型推断来获取真实类型传递给我的IoC,而不必求助于反射(将正确的泛型类型放在一起).我只是想知道是否有一个技巧可以在没有dynamic施法的情况下完成,但我猜不是.谢谢大家.
编辑2
我正在努力创造一个 IPortionOfPropertyInfoAddEditView<T>
My Property实例P属于IPortionOfPropertyInfoAddEditView需要的类型,但它的类型为Property,而不是更多的派生类型.如果我能说,我会喜欢它:
StructureMap.ObjectFactory.GetInstance<IPortionOfPropertyInfoAddEditView<typeof(P)>>()
Run Code Online (Sandbox Code Playgroud)
但这显然是不允许的.我认为使用动态演员的类型推断将是下一个最好的事情,我只是想知道是否有人有更好的方法.很抱歉从一开始就不清楚!
使用泛型无法做到这一点,因为泛型总是对静态类型的值进行操作.你通过使用运行时机制(dynamic)解决这个问题的事实是一个很好的提示.
有许多良好的运行时解决方案,但这取决于您想要做什么property(即,您想要访问哪些成员,所述成员的可见性等).