Метод расширения для строго типизированного доступа к свойству - PullRequest
2 голосов
/ 13 декабря 2010

У меня следующая иерархия классов

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?

Ответы [ 2 ]

5 голосов
/ 13 декабря 2010

Вам нужно указать общие аргументы для вызова, вот и все:

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

EDIT:

Моя вина. Я пропустил реальную проблему:

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;
}
4 голосов
/ 13 декабря 2010
static class TestExtensions
{
    public static string Property<TModel, TProperty>(this TModel test, Expression<Func<TModel, TProperty>> property)
    {
        return property.ToString();
    }
}

Компилятор должен иметь возможность вывести первый аргумент ...

...