Прежде всего, я знаю около AutoMapper, и я не хочу его использовать. Потому что я изучаю C#, и я хочу получить глубокий обзор. Поэтому я пытаюсь сам решить эту проблему (объяснил ниже).перенос значений одного объекта на другой
Тем не менее, я пытаюсь создать копир свойств, чтобы справиться с значениями свойств одного типа для другого, если свойство имеет то же имя и тип и читается из источника и может быть записано в цель. Я использую метод 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
и делегаты с поздними переводами, пожалуйста? Или все, что вы думаете, поможет мне подчиниться? Заранее спасибо.
COMPELETE 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() { }
Я не думаю, что System.Reflection.Emit поможет вам здесь. В вашем случае как исходный, так и целевой объекты существуют во время компиляции, и вы просто копируете значения соответствующих свойств от одного к другому. Emit поможет вам, если вы захотите (например) создать целевой тип во время выполнения. –