我如何拥有一个接受C#类型的[Attribute]?

时间:2012-04-30 10:26:06

标签: c# generics attributes

我创建了一个EvaluateAttribute,我希望它接受这样指定的各种IEvaluator

[Evaluate(CatEvaluator, DogEvaluator)]
public void someMethod()
{
}

由于CatEvaluatorDogEvaluator是类型,我设置了我的属性类:

   public class EvaluateAttribute<T> : Attribute where T:IAccessEvaluator

和构造函数:

public EvaluateAttribute(params T [] accessEvaluators)
{
    _accessEvaluators = accessEvaluators;
}

C#不喜欢泛型和属性,但似乎。有解决方案吗?

我希望我的属性使用CreateInstance实例化每个类型,并在IAccessEvaluator中运行特定的评估方法。

2 个答案:

答案 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;
}