10

C#ジェネリックを使用して、型Tを別の型からキャスト可能に制限する方法はありますか?

:
レジストリに情報を として保存していてstring、情報を復元するときに、次のような関数が必要だとします。

static T GetObjectFromRegistry<T>(string regPath) where T castable from string 
{
    string regValue = //Getting the registry value...
    T objectValue = (T)regValue;
    return objectValue ;
}
4

3 に答える 3

7

.NET には、そのようなタイプの制約はありません。使用できる制約は 6 種類のみです (「型パラメーターの制約」を参照)。

  • where T: struct型引数は値型でなければなりません
  • where T: class型引数は参照型でなければなりません
  • where T: new()型引数には、パラメーターなしのパブリック コンストラクターが必要です
  • where T: <base class name>型引数は、指定された基本クラスであるか、指定された基本クラスから派生している必要があります
  • where T: <interface name>型引数は、指定されたインターフェイスであるか、実装する必要があります
  • where T: UT に指定された型引数は、U に指定された引数であるか、またはその引数から派生している必要があります

文字列を自分の型にキャストしたい場合は、最初にオブジェクトにキャストできます。ただし、型パラメーターに制約を設定して、このキャストが確実に発生するようにすることはできません。

static T GetObjectFromRegistry<T>(string regPath)
{
    string regValue = //Getting the regisstry value...
    T objectValue = (T)(object)regValue;
    return objectValue ;
}

別のオプション - インターフェイスの作成:

public interface IInitializable
{
    void InitFrom(string s);
}

そしてそれを制約として置きます:

static T GetObjectFromRegistry<T>(string regPath) 
  where T: IInitializable, new()
{
    string regValue = //Getting the regisstry value...   
    T objectValue = new T();
    objectValue.InitFrom(regValue);
    return objectValue ;
}
于 2013-07-24T06:50:09.117 に答える
0

制約は、「T の型は U 型であるか、U 型を継承する必要があります」のように綴られるため、探している制約は実行できません。

Stringとにかく、.ToString()(YMMV)を介してすべてが「キャスト可能」です

于 2013-07-24T07:05:21.190 に答える
0

タイプはコンパイル時に決定されます。実行時に型を変更することはできません。オブジェクトをその基本クラスまたは子クラスにキャストできます

参照 -

オブジェクト a = new Dog() と Dog a = new Dog() の違い

于 2013-07-24T06:49:06.707 に答える