如何绕过指定通用参数类型的需要?
问题描述:
我有一个扩展方法,像这样的:如何绕过指定通用参数类型的需要?
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中做到这一点?
答
C#不支持部分泛型推理。如果编译器无法确定您必须自己提供所有类型的所有类型。
+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>();
根据您所提供的代码,我可以看到你需要将TY作为模板参数或将参数传递给您的扩展方法。 – ioWint