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

C# 强类型属性访问的扩展方法,c#,lambda,extension-methods,expression,strong-typing,C#,Lambda,Extension Methods,Expression,Strong Typing,我有下面的类层次结构 class Test { public string Name { get; set; } } class TestChild : Test { public string Surname { get; set; } } 我无法更改测试类。我想这样写下面的扩展方法: static class TestExtensions { public static string Property<TModel, TProperty>(this T

我有下面的类层次结构

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

class TestChild : Test
{
    public string Surname { get; set; }
}
无法更改测试类。我想这样写下面的扩展方法:

static class TestExtensions
{
    public static string Property<TModel, TProperty>(this Test test, Expression<Func<TModel, TProperty>> property)
    {
        return property.ToString();
    }
}
但现在编译器说

无法根据用法推断方法“ConsoleApplication1.TestExtensions.Property(ConsoleApplication1.Test,System.Linq.Expressions.Expression>)”的类型参数。尝试显式指定类型参数

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

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

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

是我的错。我忽略了真正的问题:

public static string Property<TModel, TProperty>(this TModel model, Expression<Func<TModel, TProperty>> property)
{
    return property.ToString();
}
公共静态字符串属性(此TModel模型、表达式属性)
{
return属性.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;
}
公共静态字符串属性(此TModel模型、表达式属性)
{
var memberExpression=property.Body作为memberExpression;
返回memberExpression.Member.Name;
}
静态类测试扩展
{
公共静态字符串属性(此TModel测试、表达式属性)
{
return属性.ToString();
}
}

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

就是这样。是否可以省略它们?就像asp.net mvc扩展方法Html.TextBoxFor?arg+1一样,我刚刚写了:)谢谢,toString只是开始:)我第一次错过了这个:(而且,我不认为在那里使用属性.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;
}
static class TestExtensions
{
    public static string Property<TModel, TProperty>(this TModel test, Expression<Func<TModel, TProperty>> property)
    {
        return property.ToString();
    }
}