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

时间:2011-03-18 15:52:35

标签: 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);

当我以这种方式调用方法时,推断的类型是Property,而不是派生的WellRealEstate,可能是因为类型推断是在编译时完成的。我通过将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)>>()

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

2 个答案:

答案 0 :(得分:5)

没有办法用泛型来做,因为泛型总是对静态类型的值进行操作。您通过使用运行时机制(dynamic)来解决这个问题的事实是一个很好的暗示。

有许多良好的运行时解决方案,但这取决于您对property的确切要求(即,您要访问的成员,所述成员的可见性等)。

答案 1 :(得分:2)

首先想到的是将getPropertyEditPortion类的方法实现为Property

然后,在这种情况下,你不需要关心P的派生类型是什么,只需调用你的方法,就可以运行正确的实现。

如果这不可行,那么使用dynamic关键字似乎是合适的。