具有派生类型的泛型类型推断

Ada*_*kis 4 c# generics type-inference

上课Propertyabstract

我有以下方法:

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)

但这显然是不允许的.我认为使用动态演员的类型推断将是下一个最好的事情,我只是想知道是否有人有更好的方法.很抱歉从一开始就不清楚!

Jon*_*Jon 5

使用泛型无法做到这一点,因为泛型总是对静态类型的值进行操作.你通过使用运行时机制(dynamic)解决这个问题的事实是一个很好的提示.

有许多良好的运行时解决方案,但这取决于您想要做什么property(即,您想要访问哪些成员,所述成员的可见性等).