2012-07-25 16 views
6

Microsoft Unityを使用するフレームワークにカスタムビジネスロジックを組み込むためのインターフェイスを実装しています。呼び出す必要があるメソッドの制約よりも一般的な型のインターフェイスを実装する

T InterfaceMethod<T>(); 

Tには制約がありません:私の心の問題は、私が実装する必要があるインターフェイスは次のメソッドを定義していることです。私のコードでは、私はAnotherMethodのロジックに重要である

T AnotherMethod<T>() where T: class; 

型Tのメソッドシグネチャで、さまざまなサードパーティのライブラリからメソッドを呼び出す必要があります。リフレクションを使用せずに私の実装内でAnotherMethod<T>()に電話する方法はありますか? Tが値のタイプの場合、私は明らかに別のアクションを取る必要があります。これを回避するオートボックスの方法はありますか?

+0

はAnotherMethod は()Tで何をしますか?箱に入れたい場合は、あらかじめオブジェクトにキャストするだけです。 –

+0

Tが参照型である必要があることに関するコンパイルエラーが発生しているので、私には分かりません。 – techphoria414

答えて

1

私は、あなたが探しているものが反映されていないとは思わないと思います。せいぜい、AnotherMethod<object>()に電話して結果をキャストするだけです。しかし、AnotherMethodTがあなたの目的に重要でない場合、これは実際にはうまくいくでしょう。

+0

私の場合、あなたは正しいと思われます。 – techphoria414

2

これはあなたが必要とするものではないかと思いますが、リフレクションを使わずにInterfaceMethodからAnotherMethodを呼び出すことができます。しかし、それでもConvert.ChangeTypeを使用します。

考え方は、クラスの実装を制約(ここではTin)で行うことです。次に、InterfaceMethodの制約されていないタイプTをTinに変換します。最後に、制約付きタイプのAnotherMethodを呼び出すことができます。以下は、文字列でうまく動作します。

public interface ITest 
{ 
    T InterfaceMethod<T> (T arg); 
} 

public interface ITest2 
{ 
    U AnotherMethod<U>(U arg) where U : class; 
} 

public class Test<Tin> : ITest, ITest2 where Tin : class 
{ 
    public T InterfaceMethod<T> (T arg) 
    { 
     Tin argU = arg as Tin; 
     if (argU != null) 
     { 
      Tin resultU = AnotherMethod(argU); 
      T resultT = (T)Convert.ChangeType(resultU,typeof(T)); 
      return resultT; 
     } 
     return default(T); 
    } 

    public U AnotherMethod<U> (U arg) where U : class { return arg; } 
} 
+0

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +状況を少し明確にするために私の質問を編集しました。間違いなくクラスをインスタンス化するときにを指定する能力を持つ人のために働くことができます。 – techphoria414

0

は何他の人が言っていることは、あなたがこのようにオブジェクトを介して行くことができるということです。

public interface ITest 
{ 
    T InterfaceMethod<T>(T arg); 
} 

public interface IAnotherTest 
{ 
    U AnotherMethod<U>(U arg) where U : class; 
} 

public class Test : ITest 
{ 
    private IAnotherTest _ianothertest; 

    public T InterfaceMethod<T>(T arg) 
    { 
     object argU = arg as object; 
     if (argU != null) 
     { 
      object resultU = _ianothertest.AnotherMethod(argU); 
      T resultT = (T)Convert.ChangeType(resultU, typeof(T)); 
      return resultT; 
     } 
     return default(T); 
    } 
} 
+0

Tim Sが指摘しているように、Tの型が呼び出されたメソッドにとって重要でない場合にのみ、これが機能します。残念ながらそれはそうです。 – techphoria414

関連する問題