10

ダイナミックをジェネリックとして使用するにはどうすればよいですか?

これ

var x = something not strongly typed;
callFunction<x>();

この

dynamic x = something not strongly typed;
callFunction<x>();

どちらもこのエラーを生成します

Error   1   The type or namespace name 'x' 
could not be found (are you missing a using directive or an assembly reference?)

xで使用できるほど正当なものにするにはどうすればよい<x>ですか?

4

6 に答える 6

19

型推論を使用して、呼び出しをトランポリンのように並べ替えることができます。

dynamic x = something not strongly typed;
CallFunctionWithInference(x);

...

static void CallFunctionWithInference<T>(T ignored)
{
    CallFunction<T>();
}

static void CallFunction<T>()
{
    // This is the method we really wanted to call
}

これにより、 の値の実行時の型に基づいて、実行時の型引数が決定され、コンパイル時の型としてx使用される場合と同じ種類の型推論が使用されます。パラメータは、型推論を機能させるためにのみ存在します。x

Darin とは異なり、これ便利な手法であると考えていることに注意してください。つまり、ダイナミック前にリフレクションを使用してジェネリック メソッドを呼び出すことになるのとまったく同じ状況です。このコードの一部を動的にすることができますが、コードの残りの部分 (ジェネリック型から下に向かって) はタイプ セーフに保つことができます。これにより、1 つのステップを動的にすることができます。タイプがわからない 1 ビットだけです。

于 2012-04-12T22:33:49.367 に答える
4

正確に何をしようとしているのかを伝えるのは難しいです。ただし、オブジェクトと同じ型パラメーターを使用してジェネリック メソッドを呼び出したい場合、それを直接行うことはできません。ただし、オブジェクトをパラメーターとして受け取る別のメソッドを作成しdynamic、型を推測させてから、必要なメソッドを呼び出すことができます。

void HelperMethod<T>(T obj)
{
    CallFunction<T>();
}

…

dynamic x = …;
HelperMethod(x);
于 2012-04-12T22:33:22.657 に答える
2

できません。ジェネリックの要点はコンパイル時の安全性です。つまり、ジェネリックはコンパイル時に認識されている必要があります。そして、ダイナミクスの要点は、コンパイル時に正確な型を知る必要がなく、ランタイムディスパッチを使用する必要がないということです => それはジェネリックとは正反対です。したがって、時間を無駄にしないでください => 動的/リフレクション パスを取得したら、ジェネリックとコンパイル時の安全性を忘れることができます。その道を最後まで歩かなければなりません。

あなたの質問に答えるには:

で使用できるほど正当なものにするために、x に対して何ができますか?

できる唯一のことは、コンパイル時に既知の型を使用することです。そうしないと、ジェネリックを使用できません。

于 2012-04-12T22:25:16.653 に答える
1

xタイプではないため、そのエラーが発生します。パラメーターとして型を指定する必要があります。

実際、正しく使用すれば、型パラメーターとして使用できます。dynamic

var dict = new Dictionary<string, dynamic>();

dict.Add("Item1", 123);
dict.Add("Item2", "Blah");

これは問題なくコンパイルされ、実行されます。

于 2012-04-12T22:27:51.730 に答える
0

これを機能させる最も簡単な方法は、匿名型を実際の型にすることです。

だから代わりに

var x = new { Value = "somevalue", Text = "sometext" };

あなたがする必要があります

class MyClass
{
    string Text, Value;
}
....
var x = new MyClass() { Value = "somevalue", Text = "sometext" };
//this should work now
callFunction<MyClass>(x);
于 2012-04-12T22:31:47.747 に答える