簡體   English   中英

C#泛型方法:如何聲明這種?

[英]C# Generic Method: how to declare this kind?

我希望能夠像這樣調用這個方法:

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

並具有來自 To 的 IDE 自動完成屬性。 TestMethod ,我想提取屬性的名稱。 在這種情況下Prop1 這似乎是一種工作,但我不確定Expression<Func<TTo, object>> ,尤其是對象部分。

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

如果我通過 p 遞歸,它現在會做它應該做的事情,我可以得到這個名字,但對我來說它看起來不正確,特別是因為拉取道具的名字看起來像:

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

有什么辦法可以做這個清潔工嗎?

這是一個幫助類,它將檢查表達式並提取屬性的成員信息

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

...並獲取屬性名稱。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM