0

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

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

因为CatEvaluatorDogEvaluator是类型,所以我像这样设置我的属性类:

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

和构造函数:

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

C# 似乎不喜欢泛型和属性。有针对这个的解决方法吗?

我希望我的属性CreateInstanceIAccessEvaluator.

4

2 回答 2

1

如果您只想传递实现IAccessEvaluator. 只需将签名更改为

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

重读你的问题。您正在使用对象之类的类型,所以我的第一印象是写下上面的答案。如果您需要注释类型,您应该查看对您的问题的评论(由 MUG4N 提供)。

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

[Evaluate(typeof(CatEvaluator), typeof(DogEvaluator)]
public SomeClass{ }

并更改_accessEvaluatorsType[]

于 2012-04-30T10:29:57.120 回答
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;
}
于 2012-04-30T10:37:27.603 回答