私はDynamicObject
から派生した型をいくつかの文字列のビルダーとして使用します。最後にToString
に電話して最終結果を得る。なぜdynamic.ToString()は文字列と文字列の間に何かを返しますか?
この時点で、私はそれが普通の文字列を与えると思っていましたが、この文字列は何らかの形で奇妙です。私は文字列関数を使うときのように振る舞いますが、実際に何が文字列か動的かはわかりません。
これは私がこの
dynamic example = new Example();
Console.WriteLine(example.ToString().ToUpper());
のようにそれを実行すると、結果が正しいと私のビルダー
public class Example : DynamicObject
{
public override bool TryConvert(ConvertBinder binder, out object result)
{
if (binder.ReturnType == typeof(string))
{
result = ToString();
return true;
}
result = null;
return false;
}
public override string ToString()
{
return base.ToString();
}
}
にToString
を実装する方法である:USERQUERY+EXAMPLE
(LINQPad内で実行されたときに)
しかし、私がこのような2行目を呼び出すと、
RuntimeBinderException
とアプリケーションがクラッシュした 'string' が
'拡張' の定義が含まれていませんが、私はキャスト場合
を言って
static class Extensions { public static string Extension(this string str) { return str.ToUpper(); } }
Console.WriteLine(example.ToString().Extension());
結果は再び動作します
もう1つの例があります。
Console.WriteLine((string)example); // UserQuery+Example
しかし
Console.WriteLine(example); // DynamicObject UserQuery+Example
あなたが実際にあなたがそれを文字列にキャストするまで、あなたが買ってあげるものを確認することはできません。
は、なぜこの出来事であると本当文字列を追加キャストを避けるために、何らかの形で取得する方法はありますか?あなたはそれが動的バインディングを使用して、実行時に
string.ToUpper
に解決されますtest
にToUpper
を呼び出すとdynamic example = new Example(); // test will be typed as dynamic var test = example.ToString();
:
dynamic
で呼び出さToString
がdynamic
なくstring
を返すようにタイプされているためです
大丈夫ですが、なぜ拡張機能が動的オブジェクトで直接動作しないのですが、これは 'example.ToString()。ToLower()。Extension()'では機能しません。それを具体的な型にキャストしてください。メソッドが 'int'や' string'など何かを返すかどうかに関係なく、常に '動的'を返すでしょうか? – t3chb0t
はい、あなたは正しいです。動的タイピングをエスケープするには、特定の型にキャストする必要があります。そのキャストは、静的型付き変数に動的型付き式を代入するか、静的型付けされたメソッドにパラメータとして渡すことで、明示的に( '(string)'を使用して)または暗黙的にすることができます。 – MarcinJuraszek