强类型属性访问的扩展方法

时间:2010-12-13 18:22:04

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

我有以下类层次结构

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&gt;)'的类型参数。尝试明确指定类型参数。

我希望有类似mvc Html.TextBoxFor(x =&gt; x.Name)方法的东西。 是否可以编写扩展名以便使用,如Main方法所示?

2 个答案:

答案 0 :(得分:5)

您需要指定调用的通用参数,即全部:

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

答案 1 :(得分:4)

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

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