我怎样才能有一个接受 C# 类型的 [属性]
本文关键字:类型 属性 有一个 | 更新日期: 2023-09-27 18:32:46
我创建了一个EvaluateAttribute
,我希望它接受像这样指定的各种IEvaluator
:
[Evaluate(CatEvaluator, DogEvaluator)]
public void someMethod()
{
}
由于CatEvaluator
和DogEvaluator
是类型,因此我像这样设置了属性类:
public class EvaluateAttribute<T> : Attribute where T:IAccessEvaluator
和构造函数:
public EvaluateAttribute(params T [] accessEvaluators)
{
_accessEvaluators = accessEvaluators;
}
C#似乎不喜欢泛型和属性。有解决方案吗?
我希望我的属性使用 CreateInstance
实例化每个类型,并在 IAccessEvaluator
中运行特定于 的评估方法。
如果您只想传递实现IAccessEvaluator
的类,您可能不需要使用泛型。只需将签名更改为
public EvaluateAttribute(params IAccessEvaluator [] accessEvaluators)
{
_accessEvaluators = accessEvaluators;
}
重读您的问题。你使用的是对象之类的类型,所以我的第一印象是写上面的答案。如果你需要注释类型,你应该看看你的问题的评论(通过MUG4N)。
public EvaluateAttribute(params Type [] accessEvaluators)
{
_accessEvaluators = accessEvaluators;
}
[Evaluate(typeof(CatEvaluator), typeof(DogEvaluator)]
public SomeClass{ }
并将_accessEvaluators
更改为Type[]
没有什么可以阻止接受类型的属性:
public class EvaluateAttribute : Attribute
{
private readonly Type[] _accessEvaluators;
public EvaluateAttribute(params Type[] accessEvaluators)
{
_accessEvaluators = accessEvaluators;
}
}
然后你可以像这样使用:
[Evaluate(typeof(CatEvaluator), typeof(DogEvaluator)]
public void someMethod()
{
}
不幸的是,您失去了类型安全性 - 但您始终可以向属性的构造函数添加一些运行时检查。大致如下:
public EvaluateAttribute(params Type[] accessEvaluators)
{
foreach (var type in accessEvaluators)
{
if (!typeof(IAccessEvaluator).IsAssignableFrom(type))
{
throw new InvalidOperationException("Suppied type must be of type IAccessEvaluator");
}
}
_accessEvaluators = accessEvaluators;
}