从通用引用类型<t> </t>获取枚举或静态属性

时间:2012-02-10 15:58:33

标签: c# generics .net-4.0

因此,如果名为enum的{​​{1}}中存在class属性,为什么我无法访问Bar属性或任何enum属性在这种情况下static type。我隐含地声明<T>属于<T> type。只是想知道它是否只是泛型的限制或Bar enum本身。

type

已更新

@Frederik Gheysels的回答中,提到如果我的public class Foo<T> where T : Bar { public Foo() { // This obviously works var car = Bar.Cars.Honda; var name = Bar.Name; // Why can't I do this ? var car2 = T.Cars.Toyota; var name2 = T.Name; } } public class Bar { public static string Name { get; set; } public enum Cars { Honda, Toyota }; } 只是从class派生而来,我将无法访问{{1} }} Bar的任何enum。这是不正确的,这可以编译并运行。

static

2 个答案:

答案 0 :(得分:1)

您的Cars枚举,是类Bar中的嵌套类型。它不是Bar的成员属性/方法。 因此,这是不可能的。

汽车只是一种嵌套的Bar。当您创建另一个派生自Bar的类时,我们称之为Bar2,您将无法访问Bar2.Cars,因为不会创建该类型。嵌套类型不是实例成员,因此不会被继承。

答案 1 :(得分:1)

潜在的解决方法是允许Foo<T>继承Bar以公开静态成员。要访问静态成员Name,您需要提供discussed here虚拟访问者。

public class Foo<T> : Bar where T : Bar
{
    public Foo()
    {
        // This obviously works
        var car = Bar.Cars.Honda;
        var name = Bar.Name;

        // use base class for enum accessor ?
        var car2 = Foo<T>.Cars.Toyota;
        var name2 = Foo<T>.Name;

        default(T).Accessor = "test"; // static member access
    }
}

public class Bar
{
    public static string Name { get; set; }
    public enum Cars { Honda, Toyota };
    public virtual string Accessor
    {
        get { return Name; }
        set { Name = value; }
    }
}