2012-04-30 15 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; 
} 
相關問題