#c# #lambda #expression
#c# #лямбда #выражение
Вопрос:
Я пишу картограф для моделей, и когда мне нужно присвоить значения свойствам типа string из любых других типов, я хотел бы вызвать ToString()
метод в них, получить значение и присвоить его целевому свойству. Мой код выглядит примерно так:
public class Foo { public Guid Id { get; set; } } public class Bar { public string Id { get; set; } }
Отображение лямбда-выражения должно выглядеть так:
... var $1 = new Bar(); $1.Id = parameter.Id.ToString(); ...
Комментарии:
1. Что такое параметр?
2. параметр является примером класса Foo.
3. Вопрос не очень ясен. Вы кодируете то, что делаете то, что хотите. Где лямбда вписывается в это?
4. Пожалуйста, предоставьте достаточно кода, чтобы другие могли лучше понять или воспроизвести проблему.
Ответ №1:
Рабочая версия того, как это сделать:
private Expressionlt;Funclt;TSource, TDestinationgt;gt; GenerateMapperFunclt;TSource, TDestinationgt;() { var sourceProperties = typeof(TSource) .GetProperties() .Where(x =gt; x.CanRead); var targetProperties = typeof(TDestination) .GetProperties() .Where(x =gt; x.CanWrite) .ToDictionary(x =gt; x.Name, x =gt; x, StringComparer.OrdinalIgnoreCase); var source = Expression.Parameter(typeof(TSource), "source"); var target = Expression.Variable(typeof(TDestination)); var allocate = Expression.New(typeof(TDestination)); var assignTarget = Expression.Assign(target, allocate); var statements = new Listlt;Expressiongt; { assignTarget }; foreach (var sourceProperty in sourceProperties) { if (targetProperties.TryGetValue(sourceProperty.Name, out PropertyInfo targetProperty)) { Expression sourcePropertyAssign; if (sourceProperty.PropertyType != targetProperty.PropertyType amp;amp; sourceProperty.PropertyType == typeof(string)) { var property = Expression.Property(source, sourceProperty); sourcePropertyAssign = Expression.Call(Expression.Convert(property, typeof(object)), typeof(object).GetMethod("ToString")); } else { sourcePropertyAssign = Expression.Property(source, sourceProperty); } var assignProperty = Expression.Assign( Expression.Property(target, targetProperty), sourcePropertyAssign); statements.Add(assignProperty); } } statements.Add(target); var body = Expression.Block(new[] { target }, statements); return Expression.Lambdalt;Funclt;TSource, TDestinationgt;gt;(body, source); }
Комментарии:
1. Вопрос и ответ, опубликованные одним и тем же пользователем, и в вопросе и ответе нет смысла.
2. Двухстрочная версия в вопросе лучше.