因此,如果名为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
答案 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; }
}
}