我怎样才能有一个接受 C# 类型的 [属性]

本文关键字:类型 属性 有一个 | 更新日期: 2023-09-27 18:32:46

我创建了一个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 中运行特定于 的评估方法。

我怎样才能有一个接受 C# 类型的 [属性]

如果您只想传递实现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;
}