2012-04-30 17 views
0

我创建了一个EvaluateAttribute,我想它接受这样规定的各种IEvaluator S:我怎样才能有一个接受在C#中的类型的[属性]?

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

由于CatEvaluatorDogEvaluator的类型,我建立了我的属性类,像这样:

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

和构造函数:

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

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

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

+0

请检查了这一点: http://stackoverflow.com/questions/294216/why-does-c-sharp-forbid-generic-attribute-types 问候 – MUG4N

+2

我发现在发布之前,它不包含解决方案。 – NibblyPig

回答

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[]

+0

,但'[Attribute(CatEvaluator)]'然后说'CatEvaluator'是一个用作对象或类似对象的类型 – NibblyPig

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; 
} 
相关问题