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
です。これどうやってするの?
別のSO質問でこれを読んでください...うまくいけば、あなたのためにトリックをするでしょう:
Type unknown = ((ObjectHandle)tmp).Unwrap().GetType();
詳細については、この質問を読んで投票してください。 動的に宣言されたオブジェクトのタイプを取得
単にGetType()
を使用できるはずです。そのようです:
_dynamic returnedValue = ReturnThis(value);
var returnType = returnedValue.GetType();
_
両方のソリューションは私のために働いています。リンクされた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();
}
}
}
動的タイプが与えられた場合:
dynamic dynVar;
Type type;
単に宣言された、初期化されていないdynamic
変数dynVar
は、タイプの例外をスローしますMicrosoft.CSharp.RuntimeBinder.RuntimeBinderException実行中null reference、dynVar.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();