我想做这样的事情:
public class MyAttribute : Attribute
{
public Type<BaseAllowedType>[] handledTypes { get; set; }
//...elided...
}
那将只允许有人添加属性与他们处理的类型,如果这些类型继承自BaseAllowedType
。
例:
[MyAttribute(handledTypes = SubType)]
public class MyClass
{
}
public class SubType : BaseAllowedType
{
}
这样的事情可能在C#中出现吗? (它是在Java中,但不确定C#是否允许它)
在Java中它将是public Class<? extends BaseAllowedType>[] handledTypes
首先,这是一个属性,而不是一个领域。
其次,属性不能在C#中泛化,也不能在属性中泛化。 (就此而言,字段都不能。只有类,结构,接口,委托和方法才能被泛化。)
也就是说,我们可以抓住你的问题。
有两种方法可以对泛型类型参数设置约束。第一种是对泛型类或方法的声明设置约束:
class Foo<T> where T : Animal {}
现在Foo<Giraffe>
或Foo<Animal>
或Foo<Turtle>
是合法的,但Foo<string>
不是。
其次,在接口和委托上,您可以放置协方差注释:
interface IFoo<out T>
{
T SomeProperty { get; }
}
但T
必须仅用于输出位置。使用此约束,您可以将IFoo<Giraffe>
分配给IFoo<Animal>
类型的变量,但反之亦然。
在这两个特性之间,通常可以在C#中构建合理的类型约束。