6

これが私の一般的なメソッドコードです:

  public static IT Activate<IT>(string path)
  {
        //some code here....
  }

一般的な IT は単なるインターフェイスでなければならないと設定したいと思います。

これは可能ですか?

4

4 に答える 4

7

いいえ、C#や一般的な.NETジェネリックにはそのような制約はありません。実行時に確認する必要があります。

if (!typeof(IT).IsInterface)
{
    // Presumably throw an exception
}
于 2012-10-04T15:27:31.460 に答える
3

ITいいえ、インターフェイスの種類とインターフェイスだけに制限することはできません。最も近いのはclass制約であり、それが適用されます-http to any class, interface, delegate, or array type.: //msdn.microsoft.com/en-us/library/d5x73970.aspx

于 2012-10-04T15:28:14.873 に答える
1

私が考えることができる最も近いものは、静的コンストラクターのランタイム チェックです。このような:

static MyClass<IT>()
{
    if(!typeof(IT).IsInterface)
    {
        throw new WhateverException("Oi, only use interfaces.");
    }
}

静的コンストラクターを使用すると、うまくいけばすぐに失敗することを意味するため、開発者は間違いをより早く発見できます。

また、チェックはすべてのメソッド呼び出しではなく、IT の種類ごとに 1 回だけ実行されます。したがって、パフォーマンス ヒットは発生しません。

于 2012-10-04T15:31:27.380 に答える
0

ベースインターフェイスの使用について簡単なテストを行いました。それは可能ですが、私が言ったように、努力する価値があるかどうか、またはそれが良い習慣であるかどうかはわかりません.

public interface IBaseInterface
{
}

public interface IInterface1 : IBaseInterface
{
        //some code here.... 
}

public interface IInterface2
{
        //some code here.... 
}

public class Class1
{
    public void Test()
    {
        Activate<IInterface1>("myPath");
        //Activate<IInterface2>("myPath"); ==> doesn't compile
    }

    public static IT Activate<IT>(string path) where IT : IBaseInterface
    {
        //some code here.... 
    }
}
于 2012-10-04T16:14:56.743 に答える