【问题标题】:How can I access property on object of type T, when T is a generic class with unknown parameter?当 T 是具有未知参数的泛型类时,如何访问 T 类型对象的属性?
【发布时间】:2014-03-01 01:33:40
【问题描述】:

我在一个接口中有一个泛型方法,该方法适用于参数类型 T 的对象。一种实现需要访问类型 T 的属性,在这个实现中,T 应该是 ClassA<TC> 类型,其中 TC 是未知的参数类型。我需要访问的属性位于ClassA 本身。

如何以类型安全的方式访问此 Foo.Property ?可能吗?我知道我可以使用动力学来做到这一点,但我想知道是否有不同的方法。我已经尝试过 IsAssignableFrom 和其他检查,但似乎无法正常工作。

interface IFace {
    void Request<T>(T foo);
}

class ClassA<T> {
    public int Property;
}

class ClassB : IFace {
    public void Request<T>(T foo) {
    // I want to assert that Foo is of ClassA, and access the property. 

}

【问题讨论】:

    标签: c# generics


    【解决方案1】:

    最好的方法是让ClassA 实现一个定义你想要的属性的接口,然后将T 约束到那个接口。

    可以访问约束的任何成员。您可以考虑“T”并希望该属性在那里,但您无法确定。一个接口专门用于定义某些功能由任意类型实现,因此几乎可以肯定是您正在寻找的。​​p>

    【讨论】:

    • 通常你可以直接在类上这样做,但由于 ClassA 也有一个泛型,这是你最好的选择。
    • 但是这个约束需要在 IFace.Request 上,对吧?问题是,该接口的众多实现中只有一个需要类 A 的对象,并且需要访问该属性。
    • @eZet:这表明一个更大的问题,那么:你不应该使用泛型,而应该使用重载。泛型的要点是您不关心确切的类型,或者想要使用具有某种约束的任何类型。如果你想要一个特定类的方法,该方法不应该是泛型的。
    • 我想我必须重新考虑如何解决这个问题。问题是,Request 的所有其他实现根本不依赖于 T 的类型。我实际上需要访问 T 的只是一种实现,其中 T 应该始终属于 ClassA。
    • @eZet:那么问题就更大了。您当然可以将T 的实例转换为ClassA,但您必须考虑您现在正在为这个单一实现更改公共API 的事实。这意味着ClassB 并没有真正 实现IFace,而只是假装实现。这肯定需要仔细考虑。
    猜你喜欢
    • 2013-11-22
    • 1970-01-01
    • 2012-07-04
    • 2015-11-18
    • 2022-07-06
    • 2020-08-08
    • 1970-01-01
    • 2013-08-29
    • 1970-01-01
    相关资源
    最近更新 更多