转换类<;T>;其中T:IMySampleInterface到类<;IMySampleInterface&g

本文关键字:IMySampleInterface lt 到类 其中 转换 gt | 更新日期: 2023-09-27 18:02:52

是否可以将Class<T> Where T : IMySampleInterface转换为Class<IMySampleInterface>

示例:

public abstract class AbstractCommunication: ICommunication
{
    private ICommunicationCallback<ICommunication> callback = null;
    public void registerCommunicationCallback<T>(ICommunicationCallback<T> callback) where T : ICommunication
    {
        this.callback =  (ICommunicationCallback<ICommunication>)callback; //<--DOESNT WORK
    }
}

在我的示例中,出现以下异常:System.InvalidCastException

编辑:

public interface ICommunicationCallback<T> where T : ICommunication
{
    void onCommunicationCallback(T sender, String data);
}

为什么我要这样使用:如果我有一个基类应该实现两个回调,那么我可以简单地使用以下内容:

public class TestClass : ICommunicationCallback<TestClass1>, ICommunicationCallback<TestClass2>

测试类别1:

public class TestClass1: AbstractCommunication
{
}

测试类别2:

public class TestClass2: AbstractCommunication
{
}

编辑:"如果T总是一个IC通信,那么为什么要保持它的通用性?——Davin Tryon 20分钟前"我现在锁定

好吧,没有泛型,我得到了相同的错误,但不同的System.InvalidCastException:(这就是我最初使用泛型的原因——我现在记得了(

 public class DocumentTest : ICommunicationCallback<GetDocumentData>
    {
     public void callAsync()
{
     CommunicationFactory comFactory = new CommunicationFactory(communicationServiceClient);
                GetDocumentData getDocumentData = (GetDocumentData)comFactory.createCommunicationObject(CommunicationFactory.ENTITY_TYPE.GET_DOCUMENT_DATA,(ICommunicationCallback<ICommunication> ) this);
}
}
public interface ICommunicationCallback<ICommunication> 
{
    void onCommunicationCallback(ICommunication sender, String data);
}

我认为在我的情况下,使用泛型是唯一的解决方案-请参阅:"此功能仅适用于泛型接口和委托。如果实现变体泛型接口,则实现类仍然不变。C#4.0中的类和结构不支持方差。因此以下内容不会编译://List实现协变接口//IEnumerable。但是类是不变的。List-List=new List((;//此处出现编译器错误。"(http://blogs.msdn.com/b/csharpfaq/archive/2010/02/16/covariance-and-contravariance-faq.aspx)

转换类<;T>;其中T:IMySampleInterface到类<;IMySampleInterface&g

interface ICommunication
{
}
interface ICommunicationCallback<T>
{
}
class AbstractCommunicationCallback<T> : ICommunicationCallback<T>
{
}
abstract  class AbstractCommunication : ICommunication
{
    private ICommunicationCallback<ICommunication> callback = null;
    public void registerCommunicationCallback<T>(ICommunicationCallback<T> callback) where T : ICommunication
    {
        this.callback = (ICommunicationCallback<ICommunication>)callback; //<--DOESNT WORK
    }
}
class Communication : AbstractCommunication { 
}

和测试方法

public void Test()
    {
          AbstractCommunication comm = new Communication();
         AbstractCommunicationCallback<ICommunication> callback = new AbstractCommunicationCallback<ICommunication>();
        comm.registerCommunicationCallback(callback);
    }

在.net框架4上无错误工作,与2010 相比

编辑:一些有趣的信息http://msdn.microsoft.com/en-us/library/ee207183.aspx

我解决了我的问题。但我没有使用泛型——我使用ICommunication接口。

public interface ICommunicationCallback
{
    void onCommunicationCallback(ICommunication sender, CommunicationResultObject result);
}

在我看来,这个解决方案并不那么优雅,但它确实有效。

相关文章:
  • 没有找到相关文章