Я работаю над требованием, в котором мне нужно сопоставить две системы. Поскольку это сопоставление является довольно обширным, я использую модель предметной области с некоторыми настраиваемыми атрибутами для сопоставления для извлечения данных и грубых операций.
Итак, мои классы домена выглядят примерно так:
[OhtherSystemObjectName("otherSystemAccountName")]
public class Account : SomeBaseClass
{
[OhtherSystemAttributeName("otherSystsemAccountNameColumn")]
public string Name { get; set; }
[OhtherSystemAttributeName("otherSystsemAccountNumberColumn")]
public string AccountNumber { get; set; }
[OhtherSystemAttributeName("otherSystsemAddressColumn")]
public string Address { get; set; }
[OhtherSystemAttributeName("otherSystsemPostalCodeColumn")]
public string PostalCode { get; set; }
}
Я использую настраиваемый атрибут, чтобы указать имена столбцов другой системы, поэтому мне не нужно беспокоиться об этом, когда данные необходимо получить или изменить. Теперь я хотел бы создать метод поиска данных, в котором я мог бы указать один или несколько столбцов с помощью выражений. Метод выглядит примерно так:
public string[] GetColumnSet<T>(Expression<Func<T, object[]>> attributes) where T : SomeBaseClass
{
return ((NewArrayExpression)attributes.Body).Expressions.Select(a =>
{
switch (a.NodeType)
{
case ExpressionType.MemberAccess:
return GetAttributeName((MemberExpression)a);
case ExpressionType.Convert:
return GetAttributeName((MemberExpression)((UnaryExpression)a).Operand);
}
return null;
}).Where(a => !string.IsNullOrEmpty(a)).ToArray();
}
private static string GetAttributeName(MemberExpression memberExpression)
{
var attribute = memberExpression.Member.GetCustomAttribute<OhtherSystemAttributeName>();
return attribute?.AttributeName;
}
Я использую этот метод в моем слое отображения для создания запроса к другой системе, и мне нужно указать имена столбцов в виде массива строк. Этот вызов этого метода выглядит примерно так:
var colums = GetColumnSet<Account>(a => new object[] {a.Name, a.AccountNumber});
Нет, я бы хотел, чтобы это было более похоже:
var colums = GetColumnSet<Account>(a => {a.Name, a.AccountNumber});
Без new object[]{}
, но Expression<Func<T, param object[]>>
не скомпилировать.
Можно ли переписать входное выражение для выполнения sh синтаксиса, подобного этому?