Dikkate alınması gereken birkaç senaryo var. Her şeyden önce, nesnenizin türünü kontrol etmeniz gerekir. Bunun için GetType () 'ı çağırabilirsiniz. Tür, IDynamicMetaObjectProvider uygulamazsa, herhangi bir nesnede olduğu gibi yansımayı kullanabilirsiniz. Gibi bir şey:
var propertyInfo = test.GetType().GetProperties();
Ancak, IDynamicMetaObjectProvider uygulamaları için basit yansıma çalışmaz. Temel olarak, bu nesne hakkında daha fazla bilgi sahibi olmanız gerekir. ExpandoObject ise (IDynamicMetaObjectProvider uygulamalarından biri), itowlson tarafından sağlanan yanıtı kullanabilirsiniz. ExpandoObject, özelliklerini bir sözlükte saklar ve dinamik nesnenizi bir sözlüğe dönüştürebilirsiniz.
DynamicObject ise (başka bir IDynamicMetaObjectProvider uygulaması), o zaman bu DynamicObject'in sunduğu yöntemleri kullanmanız gerekir. DynamicObject'in, özellik listesini herhangi bir yerde gerçekten "saklaması" gerekmez. Örneğin, şöyle bir şey yapabilir ( blog yazımdaki bir örneği yeniden kullanıyorum ):
public class SampleObject : DynamicObject
{
public override bool TryGetMember(GetMemberBinder binder, out object result)
{
result = binder.Name;
return true;
}
}
Bu durumda, bir özelliğe (herhangi bir adla) erişmeye çalıştığınızda, nesne yalnızca özelliğin adını bir dize olarak döndürür.
dynamic obj = new SampleObject();
Console.WriteLine(obj.SampleProperty);
//Prints "SampleProperty".
Yani, üzerinde düşünecek hiçbir şeyiniz yok - bu nesnenin herhangi bir özelliği yoktur ve aynı zamanda tüm geçerli özellik adları çalışacaktır.
IDynamicMetaObjectProvider uygulamaları için, ExpandoObject gibi özelliklerin bir listesini alabileceğiniz ve geri kalanı için yok sayabileceğiniz (veya bir istisna atabileceğiniz) bilinen uygulamaları filtrelemeniz gerektiğini söyleyebilirim.