我有以下类层次结构
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
方法所示?
答案 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();
}
}
编译器应该能够推断出第一个参数......