【问题标题】:Extension method for strongly typed property access强类型属性访问的扩展方法
【发布时间】:2010-12-13 18:22:04
【问题描述】:

我有以下类层次结构

class Test
{
    public string Name { get; set; }
}

class TestChild : Test
{
    public string Surname { get; set; }
}

无法更改 Test 类。我想像这样编写以下扩展方法:

static class TestExtensions
{
    public static string Property<TModel, TProperty>(this Test test, Expression<Func<TModel, TProperty>> property)
    {
        return property.ToString();
    }
}

为了能够通过以下方式使用它:

class Program
{
    static void Main(string[] args)
    {
        TestChild t = new TestChild();
        string s = t.Property(x => x.Name);
    }
}

但是现在编译器说

无法从用法中推断方法“ConsoleApplication1.TestExtensions.Property(ConsoleApplication1.Test, System.Linq.Expressions.Expression>)”的类型参数。尝试明确指定类型参数。

我想要类似 mvc Html.TextBoxFor(x => x.Name) 方法。 是否可以编写扩展名,如Main 方法所示使用?

【问题讨论】:

    标签: c# lambda extension-methods expression strong-typing


    【解决方案1】:

    您需要为调用指定通用参数,仅此而已:

    string s = t.Property<TestChild, string>(x => x.Name);
    

    编辑:

    我的错。我错过了真正的问题:

    public static string Property<TModel, TProperty>(this TModel model, Expression<Func<TModel, TProperty>> property)
    {
        return property.ToString();
    }
    

    这样你就可以省略通用参数。我假设您也在此方法中处理真实代码以获取属性名称?如果没有,你可能真的想要这个:

    public static string Property<TModel, TProperty>(this TModel model, Expression<Func<TModel, TProperty>> property)
    {
        var memberExpression = property.Body as MemberExpression;
        return memberExpression.Member.Name;
    }
    

    【讨论】:

    • 就是这样。是否可以省略它们?像 asp.net mvc 扩展方法 Html.TextBoxFor?
    • arg +1 和我刚写的一样 :)
    • 谢谢,toString 只是开始 :)
    【解决方案2】:
    static class TestExtensions
    {
        public static string Property<TModel, TProperty>(this TModel test, Expression<Func<TModel, TProperty>> property)
        {
            return property.ToString();
        }
    }
    

    编译器应该能够推断出第一个参数...

    【讨论】:

    • 我第一次错过了这个:(
    • 另外,我不认为 property.ToString() 是正确的做法。
    猜你喜欢
    • 1970-01-01
    • 2018-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-15
    相关资源
    最近更新 更多