.net 相似对象的通用方法

.net 相似对象的通用方法,.net,c#-4.0,.net,C# 4.0,C#4.0 如果我有N个具有完全相同属性的类(实体),那么它们没有任何公共接口或公共继承 我希望该方法能够传递它们的任何实例,而无需将任何属性从一个对象复制到另一个对象。 我认为在.NET4.0中应该有几种方法来实现这一点 e、 g以某种方式使用var或dynamik关键字或泛型类型。 可能是这样的: public void MyMethod<MyType>(AnyType myInstance) { Type myType = typeof(T);

C#4.0 如果我有N个具有完全相同属性的类(实体),那么它们没有任何公共接口或公共继承 我希望该方法能够传递它们的任何实例,而无需将任何属性从一个对象复制到另一个对象。 我认为在.NET4.0中应该有几种方法来实现这一点

e、 g以某种方式使用var或dynamik关键字或泛型类型。 可能是这样的:

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

        AppendToFile(myInstance.Field1);
        AppendToFile(myInstance.Field2);
    }
public void MyMethod(AnyType myInstance)
{
类型myType=类型(T);
myInstance=myInstance作为myType;
AppendToFile(myInstance.Field1);
AppendToFile(myInstance.Field2);
}

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

如果您希望使用
动态
,您可以使用:

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

如果您希望使用
动态
,您可以使用:

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

如果您不想或无法派生它们或添加接口,则必须使用
dynamic

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

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

如果您不想或无法派生它们或添加接口,则必须使用
dynamic

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

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

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


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

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


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

最好的方法是更改类以仅实现接口

另一种方法是创建所需的接口,然后创建一个默认的接口实现,该接口仅包装一个动态对象并实现该接口。然后,此默认实现中的任何方法都将成为底层动态的传递

这将允许您一致地使用IMyInterface接口,而不是直接使用dynamics

例如:

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

最好的方法是将类更改为只实现接口

另一种方法是创建所需的接口,然后创建一个默认的接口实现,该接口仅包装一个动态对象并实现该接口。然后,此默认实现中的任何方法都将成为底层动态的传递

这将允许您一致地使用IMyInterface接口,而不是直接使用dynamics

例如:

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

尽管这是可能的,正如其他人所指出的,但我认为让他们共享一个界面确实更整洁。如果代码不是您的,但是类是部分的(就像DBML类一样),那么您可以创建部分类来指定接口实现
public分部类ClassA:IInterface{}public分部类ClassB:IInterface{}
尽管有可能,正如其他人所指出的那样,我认为让它们共享一个接口还是比较整洁的。如果代码不是您的,但是类是部分的(就像DBML类一样),那么您可以创建部分类来指定接口实现<代码>公共部分类A:IInterface{}公共部分类B:IInterface{}