2016-05-08 4 views
-1

Я хочу, чтобы иметь возможность вызывать этот метод так:C# Общий метод: как объявить этот вид?

test.TestMethod<From, To>(to => to.Prop1); 

и имеют IDE автозаполнения свойств от до. В TestMethod я хочу вывести имя свойства. В этом случае Prop1. Кажется, что он работает, но я не уверен в Expression<Func<TTo, object>>, особенно в части объекта.

public class Test 
{ 
    public void TestMethod<TFrom, TTo>(Expression<Func<TTo, object>> p) 
    { 
    } 
} 

Он делает то, что его должен теперь, если я рекурсию через р, я могу добраться до имени, но это не выглядит правильно для меня, тем более, что вытягивать имя реквизита выглядит следующим образом:

((MemberExpression)((UnaryExpression)(((LambdaExpression)p).Body)).Operand)).Member.Name 

Любой способ сделать это чище?

+1

Возможно, что-то подобное было бы полезно? http://stackoverflow.com/questions/31261955/nameof-expression-in-net-framework-4/31262225#31262225 – Rob

+0

«Я хочу (...) иметь свойства автозаполнения IDE» - поскольку это скорее IDE -специфический, вы должны добавить соответствующий тег для IDE (возможно, Visual Studio? Или SharpDevelop? Или MonoDevelop?) на ваш вопрос. –

+0

@Rob - хм ... это работает только на "этом". Не на TTo. Метод должен быть строго типизирован для TTo. – SledgeHammer

ответ

0

Вот вспомогательный класс, который будет проверять выражение и извлекать информацию члена имущества

using System.Linq.Expressions; 
using System.Reflection; 

/// <summary> 
/// Extension for <see cref="Expression"/>. 
/// </summary> 
public static class ExpressionExtensions { 
    /// <summary> 
    /// Converts an expression into a <see cref="System.Reflection.MemberInfo"/>. 
    /// </summary> 
    /// <param name="expression">The expression to convert.</param> 
    /// <returns>The member info.</returns> 
    public static MemberInfo GetMemberInfo(this Expression expression) { 
     var lambda = (LambdaExpression)expression; 

     MemberExpression memberExpression; 
     if (lambda.Body is UnaryExpression) { 
      var unaryExpression = (UnaryExpression)lambda.Body; 
      memberExpression = (MemberExpression)unaryExpression.Operand; 
     } 
     else 
      memberExpression = (MemberExpression)lambda.Body; 

     return memberExpression.Member; 
    } 

} 

с этим, то вы можете извлечь имя, как предполагалось ...

public class Test { 
    public void TestMethod<TFrom, TTo>(Expression<Func<TTo>> property) { 
     var memberName = property.GetMemberInfo().Name; 
     //...other code 
    } 
} 

Вы затем сможет называть этот метод следующим ...

test.TestMethod<From, To>(to => to.Prop1); 

... и получите название объекта ,

Смежные вопросы