我有一个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将生成的类文件。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top