Могу ли я использовать результат выполнения лямбда — выражения при назначении свойства?

#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. Двухстрочная версия в вопросе лучше.