【问题标题】:Generic method for Similar Objects相似对象的通用方法
【发布时间】:2010-08-19 07:24:48
【问题描述】:

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

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

【问题讨论】:

  • 尽管有可能,正如其他人指出的那样,我认为让他们共享一个界面仍然更加整洁。如果代码不是你的,但类是部分的(就像 DBML 类的情况一样),你可以创建部分类来指定接口实现。 public partial class ClassA : IInterface { } public partial class ClassB : IInterface {}

标签: .net c#-4.0


【解决方案1】:

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

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

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

【讨论】:

    【解决方案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; } }    
    }
    

    【讨论】:

      【解决方案3】:

      如果你想使用dynamic,你可以使用这个:

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

      【讨论】:

        【解决方案4】:

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

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

        我要问了,难道不能改类实现同一个接口吗?

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-08-17
          • 1970-01-01
          • 2023-03-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多