治疗的一类,如果它是与接口定义
-
19-08-2019 - |
题
我有一个100类,有一些类似的元件和一些独特的。我创建了名称的类似项目如界面:界面IAnimal。我通常会做的是:
class dog : IAnimal
但也有100班,我不喜欢去,虽然他们都和寻找,我可以申请IAnimal到的。
什么我想要做的是这样的:
dog scruffy = new dog();
cat ruffles = new cat();
IAnimal[] animals = new IAnimal[] {scruffy as IAnimal, ruffles as IAnimal} // gives null
或
IAnimal[] animals = new IAnimal[] {(IAnimal)scruffy, (IAnimal)ruffles} //throws exception
然后执行
foreach (IAnimal animal in animals)
{
animal.eat();
}
有没有一种方法,使C#让我对待褶边和邋遢作为IAnimal,而无需编写:IAnimal写的类时
谢谢!
EDIT(未懒惰):这些类关闭SQL存储过程的元数据,这意味着它获取生成我将不得不回去并在添加它们,或修改代码生成器以确定当前正在使用部件每次产生接口方面,其实那不是一个坏主意。我希望有某种仿制药的方法或东西虽然。
解决方案
您可能会解决这个问题的部分类强>:让机器产生/再生的代码是在每个类的一个源文件,和手动编码部分(限定从IAnimal的子类)的另一个。
其他提示
你问的是所谓鸭打字,不C#的恐怕一部分。任何解决方案将涉及反射和看的属性,这将是更快地检查由手的类我想。
这将是一个有趣的项目尝试虽然。
的解决方案是修改代码生成器。目前,这对您的需求过于简单化。它应该增加的接口实现,如果相关属性和/或方法中存在的类。
您可以创建一个通过反射访问“eat
”适配器,一个人可怜的鸭子类型:
public class Adapter<T> : IAnimal
{
private T x;
Adapter(T x)
{
this.x = x;
}
public void eat()
{
x.GetType().GetMethod("eat").Invoke(this);
}
}
然后,可以使用这样的:
dog scruffy = new dog();
cat ruffles = new cat();
IAnimal[] animals = new IAnimal[] {new Adapter<dog>(scruffy), new Adapter<cat>(ruffles )};
不容易,我知道的,你可以使用反射做后期绑定呼叫,但你会花费时间编辑类或书面方式宏做的更好。
假设你真的不能修改有充分理由的猫类,
您可以写猫的适配器,从IAnimal即继承:
class cat_adapter : IAnimal
{
private cat baseCat;
public cat_adapter( cat aCat)
{
baseCat = aCat;
}
// Implement IAnimal interface and redirect to baseCat
public void eat()
{
baseCat.munchOnMeowMix();
}
}
在C ++中,你可以使用模板假设你所有生成的类都需要有一个名为相同的功能:
template <class BaseType>
class CAnimalAdapter : public IAnimal
{
private:
BaseType* m_baseInstance;
public:
CAnimalAdapter(BaseType* baseInstance) :
m_baseInstance(baseInstance)
{
}
void eat()
{
// You will get a compiler error if BaseType doesn't have this implemented
baseInstance->doEat();
}
}
也许有人更C# - 吡咯比我可以做同样的反映。
如果该代码产生器产生的类作为部分,可以添加用于实施接口另一局部定义
没有。有没有办法,你可以得到C#让你做到这一点没有任何有具体的基类或具有界面。
您类必须实现该接口IAnimal。具有相同名称的两个不同的类的方法/属性,除非它们是一个接口/基类的两种实现不被认为是等价的。
如果您已经实施的方法,你只是想实现该接口,您可以在IDE中使用与替换文件正则表达式。
否则,看看扩展方法。他们可能会满足您的需要。
如果您实现生成的类为局部类,你可以实现对这些类的接口,然后改变你的代码生成器只生成了部分类的一半。这将让你重新生成类不失接口实现(或您决定添加任何其他自定义逻辑)。
此类型的方法是如何LINQ到SQL将生成的类文件。