web-dev-qa-db-ja.com

オブジェクトを動的タイプに変換しようとしていますが、RunTimeBinder例外で変換が失敗します

オブジェクトを動的型に変換しようとしていますが、RunTimeBinder例外で変換が失敗します。 Stackoverflowの回答で出くわした2つの方法を使用してみました。

コード1:

object objSum;
dynamic dynSum;
objSum = dataTableColumnChart.Compute(String.Format("Count({0})", strColumnName), "");
dynSum = Convert.ChangeType(objSum, objSum.GetType());\
Debug.Writeline(dynSum);

コード2:

dynSum=objSum;
Debug.Writeline(dynSum);

スローされる例外はこれです:

A first chance exception of type 'Microsoft.CSharp.RuntimeBinder.RuntimeBinderException' occurred in Unknown Module.

どちらの場合も、Debugステートメントが実行されると例外がスローされることに注意してください。

11
JKay

例外は次のとおりです。

Cannot dynamically invoke method 'Write' because it has a Conditional attribute

そして、可能なDebug.WriteLine入力をチェックすると、「動的」はそれらの1つではありません。したがって、たとえば、文字列にキャストする必要があります。

    string strForWriteLine = dynSum.ToString() as string;
    Debug.WriteLine(strForWriteLine);

お役に立てれば

*編集:dynSum.ToString()as string;についての詳細:ToString()を使用するだけでも、動的な文字列が得られます。

var strForWriteLine = dynSum.ToString();

strForWriteLineのタイプはdynamic {string}

3
uTeisT

オブジェクトを動的に変換する拡張メソッドは次のとおりです

public static dynamic ToDynamic(this object value)
    {
        IDictionary<string, object> expando = new ExpandoObject();

        foreach (PropertyDescriptor property in TypeDescriptor.GetProperties(value.GetType()))
            expando.Add(property.Name, property.GetValue(value));

        return expando as ExpandoObject;
    }
21
Anand Patel

jsonConvertを使用する必要があります。まず、オブジェクトを文字列にシリアル化してから、文字列を動的に非シリアル化します。

string str = JsonConvert.SerializeObject(objectstring);
dynamic obj = JsonConvert.DeserializeObject(str);
9
thanh duc

以下を試してください:

dynSum = objSum;
0
Eminem