在不同的类类型上创建方法

Tam*_*arG 7 c# types class

我有两节课:

 public class MyClass1 
 {
    public string AAAAA { get; set; }
    public string BBBBB { get; set; }
    public string CCCCC { get; set; }
    public string DDDDD { get; set; }
 }

 public class MyClass2 
 {
     public string AAAAA { get; set; }  // same as MyClass1 
     public string BBBBB { get; set; }  // same as MyClass1 
     public string TTTTT { get; set; }  
 }
Run Code Online (Sandbox Code Playgroud)

现在,我要创建此方法:

public string PrintMe( Class1or2 obj) {
    string message = "";
    message += obj.AAAAA ;  // this parameter is in both MyClass1 and MyClass2
    message += obj.BBBBB ;  // this parameter is in both MyClass1 and MyClass2
    return message;
}
Run Code Online (Sandbox Code Playgroud)

关键是– 我无法触摸MyClass1和MyClass2,因此无法使它们使用相同的基数。他们是完全分开的

有什么办法可以某种方式创建此方法,否则我将为每个类重复该方法吗?

Pat*_*man 8

有一个选项可以将方法的签名更改为PrintMe(dynamic obj)

在编译时,它将接受任何对象,并且仅在运行时,它将检查obj实例是否确实具有匹配的属性。如您所知,这是非常不安全的,并且经常导致生产版本中的错误。

确实没有其他选择。如果您不能更改类,但是可以继承它,则可以实现共享这些属性的接口。仅当您实际创建实例时,这才起作用。

另一种选择是使用包装器类:

public string PrintMe(Class1or2Wrapper obj)
{ ... }
Run Code Online (Sandbox Code Playgroud)

然后,您将执行确定在哪个属性中采用的逻辑:

public class Class1or2Wrapper
{
    private Class1 c1;
    private Class2 c2;

    public Class1or2Wrapper(Class1 c1)
    {
        this.c1 = c1;
    }

    public Class1or2Wrapper(Class2 c2)
    {
        this.c2 = c2;
    }

    public string AAAAA
    {
        get
        {
            if (this.c1 != null)
                return c1.AAAAA;

            if (this.c2 != null)
                return c2.AAAAA;

            return null;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这样,您可以在限制工作量的同时确保类型安全。