Я создаю интерфейс для конкретной реализации копировального устройства. Последующим шагом будет определение того, смогу ли я легко добавить различные варианты поведения в зависимости от запрошенного типа копии (прямое копирование, или попытка, или try-catch-addToValidationDictionary). Это основной, который мне нужен / над которым я работаю - это try-catch-addToValidationDictionary. Было бы неплохо, если бы сами операторы копирования (result.AssetTag = asset.AssetTag
) можно было повторно использовать в виде списка для другого потребителя, который не нуждается в функции try / catch / validation.
Общая форма такова:
public static AssetService
{
public static ModelAsset CreateAssetDomain(IAmAnAsset asset, IValidationDictionary validationDictionary)
{
var result=new ModelAsset();
var hasExceptions=false;
try
{
result.AssetTag = asset.AssetTag;
}
catch (System.Exception exception)
{
validationDictionary.AddError(Member.Name<IAmAnAsset>(lIAmAnAsset => lIAmAnAsset.AssetTag), exception.Message);
hasExceptions = true;
}
try
{
result.LocationIdentifer = asset.LocationIdentifer;
}
catch (System.Exception exception)
{
validationDictionary.AddError(Member.Name<IAmAnAsset>(lIAmAnAsset => lIAmAnAsset.LocationIdentifer), exception.Message);
hasExceptions = true;
}
...
if (hasExceptions)
throw new ArgumentException("Failed validation");
return result;
}
}
Я пытаюсь выделить некоторые повторения с помощью лямбд, но пост Member.Name<IAmAnAsset>(lIAmAnAsset => lIAmAnAsset.AssetTag)
из этого , кажется, занимает всего Expression<Func<T,object>>
, и я не уверен, как вы бы использовали Выражение> перегрузка.
Одна попытка была следующей:
Action<Action, Expression<Func<IAmAnAsset, object>>> CopyActions = (copyAction, expression) =>
{
try
{
copyAction();
}
catch (Exception exception)
{
validationDictionary.AddError(Member.Name<IAmAnAsset>(expression), exception.Message);
hasExceptions = true;
}
};
var copyActions = new Dictionary<string,Action>()
{
Member.Name<IAmAnAsset>(z=>z.AddedBy),()=>result.AddedBy=asset.AddedBy},
Member.Name<IAmAnAsset>(z=>z.AssetTag),()=>result.AssetTag=asset.AssetTag},
...
}
foreach (var item in copyActions)
{
tryCopyAction(item.Value, item.Key);
}
if (hasExceptions)
throw new ArgumentException("Failed validation");
return result;
Я надеюсь на решение, которое уменьшит дублирование, присущее
Member.Name<IAmAnAsset>(z=>z.AddedBy),()=>result.AddedBy=asset.AddedBy},
по любому из следующих критериев:
- нужен IAmAnAsset.AddedBy в 2 местах в каждой строке
- нужно. Добавлено 3 раза на одной строке
Member.Name<IAmAnAsset>
на каждой строке
- Возможно ли использовать это выражение для получения либо имени строки, либо значения ее оценки?