c # несколько параметров выражения - PullRequest
3 голосов
/ 22 февраля 2011

Я пытаюсь создать сигнатуру метода, которая принимает несколько свойств различного типа, используя

Я бы назвал это примерно так:

AllPropertiesExcept(() => Property1, () => Property2)

Этот метод практически работает, за исключением того, что тип свойств должен быть одинаковым. Я собираюсь использовать только имя свойства, но хочу использовать лямбда-выражение для упрощения рефакторинга.

public static string MyMethod<T>(params Expression<Func<T>>[] propertyExpression)

Ответы [ 3 ]

3 голосов
/ 22 февраля 2011

Я бы использовал AllPropertiesExcept(params Expression<Func<object>>[] properties), вы все равно можете извлечь из него имена свойств, но не имеет значения, какого типа это свойство.

Редактировать: Однако я бы предпочел использовать его наоборот - вместо исключения свойств, которые я не хочу видеть, я бы включил свойства, которые я хочу видеть. Причина проста - чтобы заставить вас работать, вам все еще нужно размышлять - с моей точки зрения, вы можете легко использовать Func, который вы получаете, чтобы получить фактические данные напрямую.

Редактировать 2 (получение имени свойства из выражения):

Expression<Func<object>> obj = something; // you get this in your method

((obj.Body as UnaryExpression).Operand as MemberExpression).Member.Name

Я действительно могу посоветовать вам использовать LinqPad для таких вещей, вы можете легко развернуть объекты с помощью Dump(), который отображает объекты очень удобно для пользователя. Просто воссоздайте небольшой пример и поэкспериментируйте.

2 голосов
/ 22 февраля 2011

Метод AllPropertiesExcept() возвращает что-нибудь?В противном случае вы можете создать свободный интерфейс (используя цепочку методов):

AllPropertiesExcept(() => Property1)
    .And(() => Property2)
    .And(() => Property3);

Даже если метод AllPropertiesExcept() возвращает что-то, вы можете отложить выполнение до тех пор, пока не вызовете метод в конце цепочки методов:

var foo = AllPropertiesExcept(() => Property1)
    .And(() => Property2)
    .And(() => Property3)
    .DoSomeThing();
0 голосов
/ 22 февраля 2011

Я думаю, что вам нужно понять класс ModelMetadata, описанный здесь: http://msdn.microsoft.com/en-us/library/system.web.mvc.modelmetadata.aspx

Этот класс используется в ASP.NET MVC в ситуациях, таких как Html.LabelFor (x -> x.Name).выражение передается в метод ModelMetadata.FromLambdaExpression, описанный здесь: http://msdn.microsoft.com/en-us/library/ee428393.aspx

Поняв, как он используется в MVC, вы можете создать свой собственный код с некоторыми осознанными знаниями о том, как он применяется в других местах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...