我创建了一个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
中运行特定的评估方法。
答案 0 :(得分:1)
如果您只想传递实现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[]
答案 1 :(得分:1)
没有什么可以阻止属性接受类型:
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;
}