类似对象的通用方法

时间:2010-08-19 07:24:49

标签: .net c#-4.0

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);
    }

现在我正在调查,可能有人对此有任何想法。

4 个答案:

答案 0 :(得分:2)

如果您不想或不能派生它们或添加界面,那么您将不得不使用dynamic

我相信这样做,假设AppendToFile采用动态参数或者Field1和Field2总是相同的类型。

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

答案 1 :(得分: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; } }    
}

答案 2 :(得分:1)

如果您要使用dynamic,可以使用此功能:

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

答案 3 :(得分:0)

一种方法是使用反射(不是特定于.NET 4.0):

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

我不得不问,是不是可以改变类来实现相同的接口?