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

发布于 2024-10-07 02:41:41 字数 939 浏览 3 评论 0原文

我有以下类层次结构,

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

能够按以下方式使用它:

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 方法中所示?

I have the following class hierarchy

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

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

I can't change the Test class. I want to write following extension method like this:

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

To be able to use it in the following way:

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

But now compiler says

The type arguments for method 'ConsoleApplication1.TestExtensions.Property(ConsoleApplication1.Test, System.Linq.Expressions.Expression>)' cannot be inferred from the usage. Try specifying the type arguments explicitly.

I want to have something like mvc Html.TextBoxFor(x => x.Name) method.
Is it possible to write extension to be used as shown in the Main method?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

南巷近海 2024-10-14 02:41:41

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

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

You need to specify the generic arguments for the call, that's all:

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

EDIT:

My fault. I missed the real problem:

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

This should make it so you can omit the generic arguments. I assume you are also processing real code in this method to get the property name? If not, you may actually want this:

public static string Property<TModel, TProperty>(this TModel model, Expression<Func<TModel, TProperty>> property)
{
    var memberExpression = property.Body as MemberExpression;
    return memberExpression.Member.Name;
}
葵雨 2024-10-14 02:41:41
static class TestExtensions
{
    public static string Property<TModel, TProperty>(this TModel test, Expression<Func<TModel, TProperty>> property)
    {
        return property.ToString();
    }
}

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

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

The compiler should be able to infer the first argument...

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文