Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    text
    copied!<p>You'll need to get the member name from the lambda expression, and use reflection to get that member off of the type you've been given:</p> <pre><code>public static PropertyInfo PropInfo&lt;TContainer, TMember&gt;( Expression&lt;Func&lt;TContainer, TMember&gt;&gt; memberGetter) { var memberName = GetExpressionMemberName(memberGetter); return typeof(TContainer).GetProperty(memberName); } public static string GetExpressionMemberName&lt;TContainer, TMember&gt;( Expression&lt;Func&lt;TContainer, TMember&gt;&gt; memberGetter) { var expressionType = memberGetter.Body.NodeType; switch (expressionType) { case ExpressionType.MemberAccess: { var memberExpr = (MemberExpression) memberGetter.Body; return memberExpr.Member.Name; } case ExpressionType.Convert: { var convertExpr = (UnaryExpression) memberGetter.Body; var memberExpr = (MemberExpression) convertExpr.Operand; return memberExpr.Member.Name; } default: throw new InvalidOperationException("Expression {0} does not represent a simple member access."); } } </code></pre> <p>Here's proof that it works:</p> <pre><code>void Main() { Console.WriteLine( MyGenericMethod&lt;Employee&gt;() .GetGetMethod() .Invoke( new Employee {Name = "Bill"}, new object[] {})); } public class Employee : IEmployee { public string Name {get;set;} string IEmployee.Name { get { throw new Exception(); } } } public interface IEmployee {string Name {get;}} public PropertyInfo MyGenericMethod&lt;T&gt;() where T : IEmployee { return PropInfo((T e) =&gt; e.Name); } </code></pre> <p>Console output:</p> <pre><code>Bill </code></pre>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload