转换类<;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)
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);
}
在我看来,这个解决方案并不那么优雅,但它确实有效。