2017-01-01 6 views
4

私は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に解決されますtestToUpperを呼び出すと

dynamic example = new Example(); 
// test will be typed as dynamic 
var test = example.ToString(); 

dynamicで呼び出さToStringdynamicなくstringを返すようにタイプされているためです

答えて

6

の具体的なタイプにキャストして動的タイピングをエスケープする必要があります。

エクステンションメソッドはコンパイル時の機能なので、dynamicと拡張メソッドを入力するとサポートされません。通常の静的メソッド呼び出し構文を使用して呼び出すことができます。

Extensions.Extension(example.ToString()); 

しかし、再び - example.ToString()dynamicを返し、それがExtensions.Extension呼び出しのパラメータとして使用することができるかどうかを確認するために、実行時にどうなる結合入力します。詳細はthis answerを参照してください。

+0

大丈夫ですが、なぜ拡張機能が動的オブジェクトで直接動作しないのですが、これは 'example.ToString()。ToLower()。Extension()'では機能しません。それを具体的な型にキャストしてください。メソッドが 'int'や' string'など何かを返すかどうかに関係なく、常に '動的'を返すでしょうか? – t3chb0t

+0

はい、あなたは正しいです。動的タイピングをエスケープするには、特定の型にキャストする必要があります。そのキャストは、静的型付き変数に動的型付き式を代入するか、静的型付けされたメソッドにパラメータとして渡すことで、明示的に( '(string)'を使用して)または暗黙的にすることができます。 – MarcinJuraszek

関連する問題