Как обойти необходимость указания универсального типа параметра? - PullRequest
2 голосов
/ 17 августа 2011

У меня есть такой метод расширения:

      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?

Ответы [ 2 ]

2 голосов
/ 17 августа 2011

C # не поддерживает частичный общий вывод.Если компилятор не может определить все типы, вы должны сами указать их все.

0 голосов
/ 17 августа 2011

Вы можете сделать что-то вроде этого:

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>();
...