2010-08-19 96 views
1

C#4.0 如果我有N個具有完全相同屬性的類(實體),它們沒有任何通用接口或任何常見繼承 我想要方法能夠通過任何他們的實例,而不從一個對象複製任何屬性到另一個對象。 我認爲應該有幾種在.NET 4.0中做到這一點的方法。類似對象的通用方法

例如以某種方式使用var或dynamik關鍵字或使用泛型類型。 可能是類似的東西:

public void MyMethod<MyType>(AnyType myInstance) 
    { 
     Type myType = typeof(T); 
     myInstance = myInstance as myType; 

     AppendToFile(myInstance.Field1); 
     AppendToFile(myInstance.Field2); 
    } 

現在我調查的是,可能是有人想過這事任何想法。

+2

本書雖然這是可能的,正如其他人指出的那樣,我認爲它是真的還是整潔,使他們共享的接口。如果代碼不是你的,但是類是部分的(就像DBML類一樣),你可以創建部分類來指定接口實現。 'public partial class ClassA:IInterface {} public partial class ClassB:IInterface {}' – 2010-08-19 07:36:33

回答

1

如果你正在尋找使用dynamic,您可以使用此:

public void MyMethod(dynamic myInstance) 
{ 
    AppendToFile(myInstance.Field1); //note: you will get no intellisense support 
    AppendToFile(myInstance.Field2); 
} 
2

如果你不想或者不能導出或添加一個接口,那麼你將不得不使用dynamic

我相信這會做到這一點,假設AppendToFile採取動態參數或Field1和Field2總是相同的類型。

public void MyMethod(dynamic myInstance) 
{ 
    AppendToFile(myInstance.Field1); 
    AppendToFile(myInstance.Field2); 
} 
0

的一種方法是使用反射(不是.NET 4.0專用):

object field1Value = myType.GetField("Field1").GetValue(myInstance); 

我不得不問,是不是能夠改變類來實現相同的接口?

2

最好的方法是將類更改爲實現接口。

另一種方法是創建您所需的接口,然後創建一個只包裝動態對象並實現接口的接口的默認實現。然後,此默認實現中的任何方法都只是成爲底層動態的傳遞。

這將允許您一直使用IMyInterface接口而不是直接使用動態工作。

例如:

public interface IMyInterface 
{ 
     string Field1 { get; } 
     string Field2 { get; } 
} 

public class MyDefaultInterface : IMyInterface 
{ 
     private Dynamic _dynamic; 
     public MyDefaultInterface(dynamic target) 
     { 
      _dynamic = target; 
     } 
     public string Field1 { get { return _dynamic.Field1; } } 
     public string Field2 { get { return _dynamic.Field2; } }  
} 
相關問題