我有全部引用Common.dll的服务(Service1,Service2等),所有这些服务均位于 .Net 4.0 中,并且在重用使用者的类型时遇到了麻烦服务。
Common.dll具有
Identifier {
int Id;
string Type;
}
每个服务都实现
byte[] Get(Common.Identifier);
string Test();
服务的使用者( .Net3.5 )在reference.cs中生成代码。
class Service1 {
byte[] Get(Service1.Identifier);
string Test();
}
class Service2 {
byte[] Get(Service2.Identifier);
string Test();
}
我通过创建一个界面将它们绑在一起 将接口添加到部分类中,但只能使其用于Test()调用
public interface IService {
//byte[] Get(Service2.Identifier);
string Test();
}
public partial class Service1 : IService;
public partial class Service2 : IService;
这样,我可以互换使用服务。 我计划创建更多用作基本插件以集成到不同系统的
IService GetService(string provider) {
switch (provider) {
case "Service1":
return (IService)new Service1();
case "Service2":
return (IService)new Service2();
}
}
GetService.Test() //works perfectly.
我的问题是如何以一种无需编写大量代码即可使用Get(?? Identifier)的方式定义,修饰“标识符”。
我现在唯一想到的方法是创建一个接口IIdentifier,然后将其添加到部分类中
public partial class Service1 : IService {
byte[] Get(IIdentifier id) {
return this.Get(new Service1.Identifier() { Id = id.Id, Type = id.Type});
}
但是有很多电话,我不想全部打包。我确定我只是缺少一些简单的东西,感谢您可以提供的任何帮助。
答案 0 :(得分:0)
C#没有提供将不同类型用作同一类型的方法,即使在特定情况下成员相同也是如此。要解决此问题,您可能需要重写服务以使用共享类或将彼此映射的类,可能需要添加扩展方法以使代码看起来像Get
接受相同的类型。
如果您不需要传递唯一参数,而只需调用非虚拟/非接口方法,则可以使用dynamic
(dynamic service = ....; service.Get();
),它最接近鸭子输入,如您所愿
答案 1 :(得分:0)
我是从错误的角度进行尝试的,而我尝试这样做的方式却无法像Alexei所指出的那样起作用。
我设法通过.net 3.5(而不是4.0)进行编译,从而使一切正常工作并重用了common.dll中的类。
.Net 4.0向后兼容3.5,因此我能够从服务中引用3.5 common.dll,这使我的3.5代码可以引用common.dll,从而重新使用类型。