передача значений одного свойства объекта другому
Прежде всего, я знаю оAutoMapperи я не хочу этим пользоваться. Потому что я учусьC # и я хочу получить глубокое представление об этом. Поэтому я пытаюсь решить эту проблему (объяснено ниже) самостоятельно.
Тем не менее, я пытаюсь создать копир свойства, чтобы сопоставить значения свойств одного типа с другим, если свойство имеет то же имя и тип и доступно для чтения из источника и доступно для записи в target. я используюtype.GetProperties()
метод. Выборочный метод здесь:
static void Transfer(object source, object target) {
var sourceType = source.GetType();
var targetType = target.GetType();
var sourceProps = sourceType.GetProperties(BindingFlags.Public | BindingFlags.Instance);
var targetProps = (from t in targetType,.GetProperties()
where t.CanWrite
&& (t.GetSetMethod().Attributes & MethodAttributes.Static) == 0
select t).ToList();
foreach(var prop in sourceProps) {
var value = prop.GetValue(source, null);
var tProp = targetProps
.FirstOrDefault(p => p.Name == prop.Name &&
p.PropertyType.IsAssignableFrom(prop.PropertyType));
if(tProp != null)
tProp.SetValue(target, value, null);
}
}
Это работает, но я прочитал ответ на SO, что с помощьюSystem.Reflection.Emit
а такжеILGenerator
а такжеопоздавшие делегаты быстрее и имеют более высокую производительность. Но не было больше объяснения или какой-либо ссылки. Можете ли вы помочь мне понять способы ускорить этот код? или вы можете предложить мне несколько ссылок оEmit
, ILGenerator
, а такжеопоздавшие делегаты пожалуйста? Или что-то, что вы думаете, поможет мне в тему? Заранее спасибо.
ЗАВЕРШИТЕ Q:
Я понимаю и многому научусь из ответа @ svick. Но теперь, если я хочу использовать его как открытый универсальный метод, как я могу это сделать? что-то вроде этого:
public TTarget Transfer<TSource, TTarget>(TSource source) where TTarget : class, new() { }
или расширение:
public static TTarget Transfer<TSource, TTarget>(this TSource source) where TTarget : class, new() { }