これは、私がカスタムオブジェクトに1つのオブジェクト(Entity)の "コピー"を作成する私のコードです。
ソースとターゲットの両方に同じ名前のプロパティだけをコピーします。リフレクションとextesnionメソッドを使用してオブジェクト間のプロパティをコピー
私の問題は、エンティティが別のエンティティにナビゲートしている場合です。このケースでは、カスタムクラスのプロパティの上に追加するカスタム属性を追加しました。
のように例えばカスタムクラスに見える:私は(ネストされたオブジェクトをコピーするために)再び拡張メソッドを呼び出すしようとするタイプが実行時に決定されるため問題は、targetProp.CopyPropertiesFrom(sourceProp);
ラインである
public class CourseModel:BaseDataItemModel
{
public int CourseNumber { get; set; }
public string Name { get; set; }
LecturerModel lecturer;
[PropertySubEntity]
public LecturerModel Lecturer
{
get { return lecturer; }
set { lecturer = value; }
}
public CourseModel()
{
lecturer = new LecturerModel();
}
}
コンパイル時に拡張メソッドを解決できませんでした。
たぶん私はあなたが最初にキャストする必要があります...
public static void CopyPropertiesFrom(this BaseDataItemModel targetObject, object source)
{
PropertyInfo[] allProporties = source.GetType().GetProperties();
PropertyInfo targetProperty;
foreach (PropertyInfo fromProp in allProporties)
{
targetProperty = targetObject.GetType().GetProperty(fromProp.Name);
if (targetProperty == null) continue;
if (!targetProperty.CanWrite) continue;
//check if property in target class marked with SkipProperty Attribute
if (targetProperty.GetCustomAttributes(typeof(SkipPropertyAttribute), true).Length != 0) continue;
if (targetProperty.GetCustomAttributes(typeof(PropertySubEntity), true).Length != 0)
{
//Type pType = targetProperty.PropertyType;
var targetProp = targetProperty.GetValue(targetObject, null);
var sourceProp = fromProp.GetValue(source, null);
targetProp.CopyPropertiesFrom(sourceProp); // <== PROBLEM HERE
//targetProperty.SetValue(targetObject, sourceEntity, null);
}
else
targetProperty.SetValue(targetObject, fromProp.GetValue(source, null), null);
}
}
ValueInjectorはあなたの時間を節約するかもしれませんhttp://valueinjecter.codeplex.com/ – Brook