4

に変換することは可能ですか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);
}

なぜこの方法を使用するのか: たとえば 2 つのコールバックを実装する必要がある基本クラスがある場合は、次のように単純に使用できます。

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

TestClass1:

public class TestClass1: AbstractCommunication
{

}

TestClass2:

public class TestClass2: AbstractCommunication
{

}

編集:「Tが常にICommunicationである場合、なぜそれを一般的なままにするのですか? – Davin Tryon 20分前」Im lock at this point

わかりましたジェネリックなしで、同じエラーが発生しましたが、異なり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 )

4

2 に答える 2

2
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 Framework 4、vs2010でエラーなしで動作

編集:いくつかの興味深い情報http://msdn.microsoft.com/en-us/library/ee207183.aspx

于 2013-03-08T15:12:58.187 に答える
0

私は自分の問題を解決しました。しかし、私はジェネリックを使用していません-私はICommunicationInterfaceを使用しています。

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

私の意見では、このソリューションはそれほどエレガントではありませんが、機能します。

于 2013-03-11T09:33:05.847 に答える