C#-通过参数传递继承的类

本文关键字:继承 参数传递 C#- | 更新日期: 2023-09-27 18:28:19

我有一个场景,在这个场景中,我希望能够通过方法参数传递一个类,并从传递的类的实例中获得特定于类的信息。

示例:

public abstract class Foo {
   public int x;
}

然后

public class Bar : Foo {
    public int y;
    public Bar(int y) {
        this.y = y;
    }
}

我需要做的是像这个

public void foobar(Foo f) {
    int y = f.y;
}

可以这样称呼:

foobar(new Bar(5));

这将获得一个特定于从Foo类"继承"的类"Bar"的值。

我需要能够在不进行类型转换的情况下完成此操作,以便动态处理该类。

我知道我只能说

((Bar)f).y

然而,重点是我将有多个类被传递,静态类型转换将无法达到目的。

C#-通过参数传递继承的类

您不应该违反OOP规则。这里有一个解决方案:

public interface IBar
{
    int Y { get; }
}
public Bar : Foo, IBar { ... }
public void foobar(IBar f) {
    int y = f.Y;
}

但如果你真的想,你可以:

使用动态:

public void foobar(Foo f) 
{
    dynamic df = (dynamic)f;
    int y;
    try
    {
       y = df.y;
    }
    catch (RuntimeBinderException)
    {
       // case when foo doesn't have a y
    }
}

或反射:

public void foobar(Foo f) 
{
    var type = f.GetType();
    var field = type.GetFields(BindigFlags.Instance 
                                | BindigFlags.Public)
                      .FirstOrDefault(info => info.Name == "y");
    if (field == null)
    {
       // case when f doesn't have a field
    }
    int y = (int)field.GetValue(f);
}

你想用你的设计做什么是不可能的。想到的一种方法是在Foo中定义抽象方法,所有继承的类都将覆盖该方法。此方法将返回y(或来自其他派生类的其他信息)。

public abstract class Foo {
   public int x;
   public abstract int GetValue();
}
public class Bar : Foo 
{
  private int y;
  public Bar(int y) 
  {
    this.y = y;
  }
  public override int GetValue()
  {
     return y;
  }
}

然后你可以像这个一样检索值

public void foobar(Foo f) {
    int y = f.GetValue();
}

这可以通过鸭子打字来完成,请参阅这个链接:鸭子打字。

这可以在C#中通过使用dynamic关键字来完成。