我有一个过去几天一直困扰我的 C# 问题。我将尝试根据对我正在做的事情的抽象描述来解释它。希望它很容易遵循。;)
假设我们有一个接口
interface iFoo {
void a();
}
此外,我有例如 2 个实现此接口的类及其中的方法:
class bar1 : iFoo
{
public void a() { Console.WriteLine("bar1"); }
public void anotherMethodBar1() { Console.Write("I love "); }
}
class bar2 : iFoo
{
public void a() { Console.WriteLine("bar2"); }
public void anotherMethodBar2() { Console.Write("beer"); }
}
每个类还提供了一个额外的唯一方法 - anotherMethodBar1() 和 anotherMethodBar2()。现在在我的 main() 中,我想创建一个列表,其中包含实现我的接口的对象,如下所示:
namespace ExampleFooBar
{
class Program
{
static void Main(string[] args)
{
List<iFoo> fooBarObjects = new List<iFoo>();
fooBarObjects.Add(new bar1());
fooBarObjects.Add(new bar2());
for(int i = 0; i < fooBarObjects.Count; i++)
{
if(fooBarObjects[i].GetType() == typeof(bar1))
{
//Cast element to bar1 and use anotherMethodBar1()
}
if(fooBarObjects[i].GetType() == typeof(bar2))
{
//Cast element to bar2 and use anotherMethodBar2()
}
}
}
}
}
如您所见,我想调用每个对象自己的(不包含在接口中)方法(基于我们有 anotherMethodBar1() 或 anotherMethodBar2() 的类,它们不是接口的一部分)。问题是——我该怎么做?我是 C# 的新手,到目前为止,我的经验与铸造没什么关系,但现在我需要它。这甚至是通过使用铸造来完成的还是有其他方法?不能简单地调用方法
if(fooBarObjects[i].GetType() == typeof(bar1))
{
fooBarObjects[i].anotherMethodBar1();
}
因为 C# 不理解底层的确切类型,因此该对象的可用方法/函数只是标准一次加上我的 a() 方法:
- 一个()
- 等于()
- 获取类型()
- 获取哈希码()
- 字符串()
我真的试图找到一个解决方案,但到目前为止,只经常问到相反的问题 - 对象列表到接口转换列表。
非常感谢和最好的问候!