Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 对象作为没有实现的接口_C#_.net - Fatal编程技术网

C# 对象作为没有实现的接口

C# 对象作为没有实现的接口,c#,.net,C#,.net,我遇到了一个奇怪的情况,在这种情况下,我的一个方法必须接收对象或动态参数(因为它将接收任何内容),但我确实关心该类至少实现两个方法 显然,只要使用我的方法中所有想要接收的对象都必须实现的接口就好了;遗憾的是,我不能保证 我在我的类中使用了很多这个对象(以及这两个函数),我想引用这个对象,它的“类型”是“IImplementsBothMethods”,这样我就可以在知道它不会中断的情况下进行转换后使用它 我想要的是这样的: public interface IImplementsBothMetho

我遇到了一个奇怪的情况,在这种情况下,我的一个方法必须接收对象动态参数(因为它将接收任何内容),但我确实关心该类至少实现两个方法

显然,只要使用我的方法中所有想要接收的对象都必须实现的接口就好了;遗憾的是,我不能保证

我在我的类中使用了很多这个对象(以及这两个函数),我想引用这个对象,它的“类型”是“IImplementsBothMethods”,这样我就可以在知道它不会中断的情况下进行转换后使用它

我想要的是这样的:

public interface IImplementsBothMethods
{
  Method1();
  Method2();
}

public class ClassThatReceivesAnything
{
  IImplementsBothMethods obj;

  public ClassThatReceivesAnything([dynamic|object] unknownObject)
  {
     // unknownObject does not implement the interface
     obj = unknownObject as IImplementsBothMethods;
  }

  public void MethodThatDoesNotCare()
  {
    obj.Method1();
    obj.Method2();
  }
}
我怎样才能做到这一点?强制转换只返回空值


谢谢

如果您不能要求传入对象实现一个接口,那么您就不能使用具有直接引用的强类型代码(这在您试图实现时是有意义的)

您可以创建强类型包装器,以保护其余代码不受强制转换的影响。包装器可以仅仅依赖于
动态
/反射,也可以使用一些更复杂的代码,比如为每个传入类型创建唯一的实例,这些实例都是用表达式树构造的

class WrapperToImplementBoth : IImplementsBothMethods
{
   private dynamic inner;
   public WrapperToImplementBoth(dynamic v)
   {
        inner = v;
   }

   // let dynamic handle calls, consider catching/logging exceptions  
   public void Method1() {inner.Method1()}; 
   public void Method2() {inner.Method2()};
}

如果您不能要求传入对象来实现接口,那么就不能使用具有直接引用的强类型代码(这在您试图实现时是有意义的)

您可以创建强类型包装器,以保护其余代码不受强制转换的影响。包装器可以仅仅依赖于
动态
/反射,也可以使用一些更复杂的代码,比如为每个传入类型创建唯一的实例,这些实例都是用表达式树构造的

class WrapperToImplementBoth : IImplementsBothMethods
{
   private dynamic inner;
   public WrapperToImplementBoth(dynamic v)
   {
        inner = v;
   }

   // let dynamic handle calls, consider catching/logging exceptions  
   public void Method1() {inner.Method1()}; 
   public void Method2() {inner.Method2()};
}

如果您不能要求传入对象来实现接口,那么就不能使用具有直接引用的强类型代码(这在您试图实现时是有意义的)

您可以创建强类型包装器,以保护其余代码不受强制转换的影响。包装器可以仅仅依赖于
动态
/反射,也可以使用一些更复杂的代码,比如为每个传入类型创建唯一的实例,这些实例都是用表达式树构造的

class WrapperToImplementBoth : IImplementsBothMethods
{
   private dynamic inner;
   public WrapperToImplementBoth(dynamic v)
   {
        inner = v;
   }

   // let dynamic handle calls, consider catching/logging exceptions  
   public void Method1() {inner.Method1()}; 
   public void Method2() {inner.Method2()};
}

如果您不能要求传入对象来实现接口,那么就不能使用具有直接引用的强类型代码(这在您试图实现时是有意义的)

您可以创建强类型包装器,以保护其余代码不受强制转换的影响。包装器可以仅仅依赖于
动态
/反射,也可以使用一些更复杂的代码,比如为每个传入类型创建唯一的实例,这些实例都是用表达式树构造的

class WrapperToImplementBoth : IImplementsBothMethods
{
   private dynamic inner;
   public WrapperToImplementBoth(dynamic v)
   {
        inner = v;
   }

   // let dynamic handle calls, consider catching/logging exceptions  
   public void Method1() {inner.Method1()}; 
   public void Method2() {inner.Method2()};
}

我误解你的问题了吗?接受任何东西(iImplementsBothMethodsObj){}的公共类不是选项吗?我误解了你的问题吗?接受任何东西(iImplementsBothMethodsObj){}的公共类不是选项吗?我误解了你的问题吗?接受任何东西(iImplementsBothMethodsObj){}的公共类不是选项吗?我误解了你的问题吗?接受任何东西(IImplementsBothMethods obj){}的公共类不是选项吗?今天学到了一些新东西。。。鸭子打字。今天学到了一些新东西。。。鸭子打字。今天学到了一些新东西。。。鸭子打字。今天学到了一些新东西。。。鸭子打字。