2017-03-14 13 views
0

は、基本インタフェースです:クラスを別のクラスにコピーするにはどうすればいいですか?ここ

public interface Group 
{ 
    string GroupName { get; set; } 
} 

そして、ここでは、最初のクラスは

public class GroupOne:Group 
{ 
    string _GroupName; 
      public string GroupName 
      { 
       set { _GroupName = value; } 
       get { return _GroupName; } 
      } 
} 

そして、ここで第二のクラスは、最後に

public class GroupTwo:Group,INotifyPropertyChanged 
    { 
     public event PropertyChangedEventHandler PropertyChanged; 
      private void NotifyPropertyChange(string propertyName) 
      { 
       if (PropertyChanged != null) 
       { 
        PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
       } 
      } 
string _GroupName; 
      public string GroupName 
      { 
       get 
       { 
        return _GroupName; 
       } 
       set 
       { 
        _GroupName = value; 
        NotifyPropertyChange("GroupName"); 
       } 
      } 
    } 

さ:

GroupOne G1=new GroupOne(); 
G1.GroupName="123"; 
GroupTwo G2; 

これは例ですが、実際にはインターフェイスには80以上のプロパティがありますが、 'GroupName' oneだけではありません。 'G1'から 'G2'への 'Group'インターフェイスのすべてのプロパティベースをコピーできますか?

答えて

1

あなたは、リフレクションを使用して開かれている場合は、次のコードは、コピーを達成するあなたを助けるかもしれませんが:

static void ReflectionMerge<T>(T source, T target) 
    where T: class 
{ 
    var properties = typeof(T). 
     GetProperties(). 
     Where(x => x.CanRead && x.CanWrite); 

    foreach(var property in properties) 
    { 
     var sourceValue = property.GetValue(source); 
     property.SetValue(target, sourceValue); 
    } 
} 

あなたはこのようにそれを使用することができます:

GroupOne G1 = new GroupOne(); 
G1.GroupName = "123"; 
GroupTwo G2 = new GroupTwo(); 

ReflectionMerge<Group>(G1, G2); 

それはリフレクションを留意する必要があるさマージ/クローニングを達成する最も効率的な方法ではありません。

あなたは、常に以下のような解決策のために行くことができます:あなたはあなたのタイプのマッピングにAutoMapperを使用することができます

public static void MergeWith(this Group target, Group source) 
{ 
    target.GroupName = source.GroupName; 
    // target.Foo = source.Foo; 
    // target.Bar = source.Bar; 
} 
+0

ありがとうございました!反射法はlinqを使っていますか? –

0

。 @StfBln答えは確かに有効なアプローチですが、AutoMapperは実際にこの手動変換を簡素化します。これは、複数のオブジェクトペアを変換するときに特に便利です。 もちろん、セットアップを最初に行う必要があります(開始するにはHow do I use AutoMapper?を参照してください)。これを簡単に再開したり、他のプロジェクトでも展開したりすることができます。このようになりますマッピングの設定

Mapper.Map<GroupTwo>(g1); 

を::

だからあなたのユースケースのためのマッピングは次のようになります

Mapper.Initialize(cfg => cfg.CreateMap<GroupOne, GroupTwo>()); 

をか、のために別のプロファイルに入れたい場合簡単に拡張できます...

public class MyAutoMapperProfile : Profile 
{ 
    CreateMap<GroupOne, GroupTwo>(); 
} 

...登録は次のようになります。

Mapper.Initialize(config => config.AddProfile<MyAutoMapperProfile>()); 
+0

ありがとうございます!AutoMapperは効果的なアプローチです! –

関連する問題