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
然而,重点是我将有多个类被传递,静态类型转换将无法达到目的。
您不应该违反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关键字来完成。