一切之前,我知道AutoMapper,我不希望使用它。因爲我在學習C#,我想深入瞭解它。所以我試圖自己做這個問題(下面解釋)。transfering一個對象的屬性值,另一個
不過,我試圖創建一個屬性複印機應付的一個類型的屬性值,以一個又一個,如果屬性具有相同的名稱和類型,是從源頭和可寫在目標可讀。我正在使用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問:
我瞭解和@ 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將幫助您。 – 2012-03-18 21:07:05