2011-08-17 154 views
2

我有一個擴展方法,像這樣的:如何繞過指定通用參數類型的需要?

 public static void ImplementsAttribute<TX, TY>(this Expression<Func<TY>> expression) 
    where TX : Coupling.PropertiesMergerAttribute 
    { 
    var memberExpression = expression.Body as MemberExpression; 
    var name = MetaHelper.GetPropertyName(expression); 
    var property = memberExpression.Expression.Type.GetProperty(name); 
    var attributes = property.GetCustomAttributes(true); 
    Assert.IsTrue(attributes.Any(a => a is TX)); 
    } 

其實我可以用我的代碼是這樣的:

 Expression<Func<String>> nameProperty =() => new ImprovisedExplosiveXML().Name; 
    nameProperty.ImplementsAttribute<Coupling.UnresolvablePropertiesMergerAttribute, String>(); 

,但我想並不需要指定第二個泛型參數類型:

 Expression<Func<String>> nameProperty =() => new ImprovisedExplosiveXML().Name; 
    nameProperty.ImplementsAttribute<Coupling.UnresolvablePropertiesMergerAttribute>(); 

有沒有辦法在C#3.5中做到這一點?

+0

根據您所提供的代碼,我可以看到你需要將TY作爲模板參數或將參數傳遞給您的擴展方法。 – ioWint

回答

2

C#不支持部分泛型推理。如果編譯器無法確定您必須自己提供所有類型的所有類型。

+0

感謝您的回覆。我意識到我不需要編譯時參數的類型,所以我用<表達式>替換了表達式>,它對我的​​使用非常有效。 – Soath

0

你可以做這樣的事情:

public class AttributeTester 
{ 
    public Attribute[] Attributes { get; set; } 

    public void ImplementsAttribute<TAttType>() 
    { 
     Assert.IsTrue(Attributes.Any(x => x is TAttType)); 
    } 
} 

public static void ForProperty<TType, TProperty>(this TType obj, Expression<Func<TType, TProperty>> expression) 
{ 
    var memberExpression = expression.Body as MemberExpression; 
    var name = MetaHelper.GetPropertyName(expression); 
    var property = memberExpression.Expression.Type.GetProperty(name); 
    return new AttributeTester { Attributes = property.GetCustomAttributes(true) }; 
} 

然後,你應該能夠只寫它像這樣:

new ImproveisedExplosiveXML().ForProperty(x => x.Name).ImplementsAttribute<SomeAttribute>(); 
+0

?我不明白。我需要看看一個屬性是否綁定了一個屬性。在你建議我的最後一行中,沒有def。對於TX,這是我想要在屬性中尋找的屬性: 'Assert.IsTrue(attributes.Any(a => a is TX));' – Soath

+0

對不起,我忘了在方法中指定屬性。一秒鐘... – Tejs

+0

更新了新的方法和類 – Tejs

相關問題