これが私の一般的なメソッドコードです:
public static IT Activate<IT>(string path)
{
//some code here....
}
一般的な IT は単なるインターフェイスでなければならないと設定したいと思います。
これは可能ですか?
これが私の一般的なメソッドコードです:
public static IT Activate<IT>(string path)
{
//some code here....
}
一般的な IT は単なるインターフェイスでなければならないと設定したいと思います。
これは可能ですか?
いいえ、C#や一般的な.NETジェネリックにはそのような制約はありません。実行時に確認する必要があります。
if (!typeof(IT).IsInterface)
{
// Presumably throw an exception
}
IT
いいえ、インターフェイスの種類とインターフェイスだけに制限することはできません。最も近いのはclass
制約であり、それが適用されます-http to any class, interface, delegate, or array type.
: //msdn.microsoft.com/en-us/library/d5x73970.aspx
私が考えることができる最も近いものは、静的コンストラクターのランタイム チェックです。このような:
static MyClass<IT>()
{
if(!typeof(IT).IsInterface)
{
throw new WhateverException("Oi, only use interfaces.");
}
}
静的コンストラクターを使用すると、うまくいけばすぐに失敗することを意味するため、開発者は間違いをより早く発見できます。
また、チェックはすべてのメソッド呼び出しではなく、IT の種類ごとに 1 回だけ実行されます。したがって、パフォーマンス ヒットは発生しません。
ベースインターフェイスの使用について簡単なテストを行いました。それは可能ですが、私が言ったように、努力する価値があるかどうか、またはそれが良い習慣であるかどうかはわかりません.
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....
}
}