C# 如何将对象强制转换到其他接口中

C# 如何将对象强制转换到其他接口中,c#,.net,interface,casting,C#,.net,Interface,Casting,这是我的密码 IDevice接口用于声明类是MessageBus的设备 公共接口设备 { int ID{get;} } issubscriber用于声明该类是订阅者并已订阅TMessage 公共接口是订阅者,其中TMessage:IMessage { 无效侦听(TMessage message); } IMessage用于声明消息 公共接口IMessage{} 这里定义了一条消息和一个订阅该消息的设备 公共类TestMessage:IMessage{} 公共类测试设备:IDevice,IS

这是我的密码

IDevice
接口用于声明类是
MessageBus
的设备

公共接口设备
{
int ID{get;}
}
issubscriber
用于声明该类是订阅者并已订阅
TMessage

公共接口是订阅者,其中TMessage:IMessage
{
无效侦听(TMessage message);
}
IMessage
用于声明消息

公共接口IMessage{}
这里定义了一条消息和一个订阅该消息的设备

公共类TestMessage:IMessage{}
公共类测试设备:IDevice,ISubscriber
问题来了,我如何将
TestDevice
IDevice
转换为
issubscriberlist

公共类消息总线
{
//关键字:消息类型
公共字典订阅列表{get;}
//...
公共无效订阅(IDevice设备)
{
var deviceInfo=device.GetType();
var isSubscriber=deviceInfo.GetInterfaces().Any(item=>item.IsGenericType&&
if(发行人/订阅人)
{
var subscriptionList=deviceInfo.GetInterfaces().Cast().ToList().FindAll(item=>item.IsGenericType&&item.GetGenericTypeDefinition()==typeof(isSubscriber));
foreach(订阅列表中的var订阅)
{
var message=subscription.GenericTypeArguments.First();
如果(!SubscriberList.ContainsKey(消息))
{
添加(消息,新列表());
}
//问题来自于,如何将设备从IDevice转换为ISubscriber或ISubscriber
订阅列表[消息]。添加(设备);
}
}
}
//...
}

如果是转储问题,很抱歉。

您可以使用
is
检查类型和强制转换对象:

if(device is ISubscriber<TestMessage> subscriber){
     // Use subscriber
}
if(设备是ISubscriber订户){
//使用订户
}
但是,在使用这些类型的模式时应该相当小心,因为它很容易导致方法根据给定对象的类型表现出不同的行为。如果唯一的改变是更好的性能,这可能很好,但这里的情况似乎不是这样

在这种情况下,最好采用两个单独的参数,一个用于设备,另一个用于订阅者。这可能是同一个对象,但方法不应考虑这一点。您还可以创建一个从这两个对象继承的
IDeviceSubscriber
接口

您还应该小心使用泛型
ISubscriber
ISubscriber
是完全不同的类型。如果是,一种类型可以转换为另一种类型,但使用协方差/逆变换有一系列规则


如果不了解问题域,则很难提供更具体的建议。

您不能将
IDevice
强制转换到不相关的接口
issubscriber
。这两个接口没有继承关系。但是,您可以将
TestDevice
强制转换到任何接口。如果您希望所有设备都作为子接口工作,请cribers,你需要有
IDevice
继承自
ISubscriber
,那么有没有一种方法可以将
IDevice
转换为它的真实类,比如这里的
TestDevice
?真正的问题是,当你真的需要
ISubscriber
时,你为什么要使用
IDevice
?如果你希望
IDevice
成为
>ISubscriber
为什么不让它继承自
ISubscriber
?我希望有其他接口,如
IClient
,设备可以是
IClient
,但不能是
ISubscriber
。如果将ISubscriber更改为
公共接口ISubscriber,其中的TMessage:IMessage{void Listen(IMessage message);}
您可以将TestDevice分配或传递给任何需要
ISubscriber
的变量或参数。如果您试图将一个接口强制转换为一个不相关的接口,那么您就错了