[英]C# - Passing a inherited class through a parameter
我有一种情况,我希望能够通过方法参数传递类,并从传递的类的实例中获取类的特定信息。
例:
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));
这将获得特定于“ Bar”类的值,该类是从Foo类“继承”的。
我需要能够做到这一点而无需打版,以便可以动态处理该类。
我知道我只能说
((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);
}
可以通过鸭子输入来完成,请参考此链接: 鸭子输入 。
这可以使用动态关键字在C#中完成。
您试图做的设计是不可能的。 我想到的一种方法-在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();
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.