web-dev-qa-db-ja.com

実行時に動的データ型の型を確認するにはどうすればよいですか?

ASP.NET Webサイトには、dynamic型の値を返すメソッドがあります。このメソッドは、特定の基準と結果に応じて、ブール値またはSortedListを返します。

貼り付けるコードが多すぎますが、たとえば:

public dynamic ReturnThis(dynamic value)
{
    if(someConditionIsMet)
    {
        value = true;
    }
    else
    {
        value = new List<String>().Add(new Person() { Name = "Travis" });
    }

    return value;
}

私の問題は、このメソッドを呼び出した後、そのデータを操作または読み取る前に、値のdatatypeを決定したいことです。しかし、どのタイプを確認するかわからないdynamic valueです。これどうやってするの?

18

別のSO質問でこれを読んでください...うまくいけば、あなたのためにトリックをするでしょう:

Type unknown = ((ObjectHandle)tmp).Unwrap().GetType();

詳細については、この質問を読んで投票してください。 動的に宣言されたオブジェクトのタイプを取得

17
Troy Carlson

単にGetType()を使用できるはずです。そのようです:

_dynamic returnedValue = ReturnThis(value);
var returnType = returnedValue.GetType();
_

ここにGetType()の詳細があります

14
Smeegs

両方のソリューションは私のために働いています。リンクされたSmeegsのドキュメントでは、isキーワードが言及されました。そして、もう少し読みやすいソリューションを思い付きました。

if(value is Boolean) { }およびif(value is List<Person>) { }


動作テスト:

using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication3348
{
    class Program
    {
        class Person
        {
            string Name = "";
        }

        static void Main(string[] args)
        {

            Console.WriteLine("Assigning List to value");
            dynamic value = new List<Person>();

            if (value is List<Person>)
            {
                Console.WriteLine("value is a list");
            }

            value = false;

            Console.WriteLine("Assigning bool to value");
            if (value is Boolean)
            {
                Console.WriteLine("value is bool");
            }

            Console.Read();
        }
    }
}
10

動的タイプが与えられた場合:

dynamic dynVar;
Type type; 

単に宣言された、初期化されていないdynamic変数dynVarは、タイプの例外をスローしますMicrosoft.CSharp.RuntimeBinder.RuntimeBinderException実行中null referencedynVar.GetType()を介してType-Reflectionを実行する場合。

  • 「Troy Carlson」が指摘したように、リモートの MarshalByRefObject を使用したかなり遅い方法を使用できます。

     Type type = ((ObjectHandle)dynVar).Unwrap().GetType();
     // > type...is null
    
  • しかし、他のタイプに関しては単純なnullチェックで十分です。

     type = dynVar == null ? null : dynVar.GetType();
    
  • または...

     type = dynVar?.GetType();
    
2
Lorenz Lo Sauer