C# 对象作为没有实现的接口
我遇到了一个奇怪的情况,在这种情况下,我的一个方法必须接收对象或动态参数(因为它将接收任何内容),但我确实关心该类至少实现两个方法 显然,只要使用我的方法中所有想要接收的对象都必须实现的接口就好了;遗憾的是,我不能保证 我在我的类中使用了很多这个对象(以及这两个函数),我想引用这个对象,它的“类型”是“IImplementsBothMethods”,这样我就可以在知道它不会中断的情况下进行转换后使用它 我想要的是这样的:C# 对象作为没有实现的接口,c#,.net,C#,.net,我遇到了一个奇怪的情况,在这种情况下,我的一个方法必须接收对象或动态参数(因为它将接收任何内容),但我确实关心该类至少实现两个方法 显然,只要使用我的方法中所有想要接收的对象都必须实现的接口就好了;遗憾的是,我不能保证 我在我的类中使用了很多这个对象(以及这两个函数),我想引用这个对象,它的“类型”是“IImplementsBothMethods”,这样我就可以在知道它不会中断的情况下进行转换后使用它 我想要的是这样的: public interface IImplementsBothMetho
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){}的公共类不是选项吗?今天学到了一些新东西。。。鸭子打字。今天学到了一些新东西。。。鸭子打字。今天学到了一些新东西。。。鸭子打字。今天学到了一些新东西。。。鸭子打字。