Dinamik desen mi kullanıyorsunuz? Dinamik anahtar kelimeyi kullanarak herhangi bir yöntemi / özelliği çağırabilirsiniz, değil mi? Örneğin, myDynamicObject.DoStuff () yöntemini çağırmadan önce yöntemin var olup olmadığını nasıl kontrol edebilirim?
Dinamik desen mi kullanıyorsunuz? Dinamik anahtar kelimeyi kullanarak herhangi bir yöntemi / özelliği çağırabilirsiniz, değil mi? Örneğin, myDynamicObject.DoStuff () yöntemini çağırmadan önce yöntemin var olup olmadığını nasıl kontrol edebilirim?
Yanıtlar:
Böyle bir şey yazabilirsiniz:
public static bool HasMethod(this object objectToCheck, string methodName)
{
var type = objectToCheck.GetType();
return type.GetMethod(methodName) != null;
}
Düzenleme: Hatta bir uzantı yöntemi yapabilir ve bu şekilde kullanabilirsiniz
myObject.HasMethod("SomeMethod");
Yansıma yoluyla
var property = object.GetType().GetProperty("YourProperty")
property.SetValue(object,some_value,null);
Benzer yöntemler için
GetType()
gibi bir yöntem var GetProperties()
. Dizisini döndürüyor PropertyInfo
. Ancak GetProperties()
yöntemi nasıl kullanabilirim ?
Bu eski bir soru, ama ben sadece onunla karşılaştım.
Type.GetMethod(string name)
bu ada sahip birden fazla yöntem varsa bir AmbiguousMatchException kurar, bu nedenle bu durumu daha iyi ele alırız
public static bool HasMethod(this object objectToCheck, string methodName)
{
try
{
var type = objectToCheck.GetType();
return type.GetMethod(methodName) != null;
}
catch(AmbiguousMatchException)
{
// ambiguous means there is more than one result,
// which means: a method with that name does exist
return true;
}
}
Bunun için herhangi bir dinamik tür kullanmamak ve sınıfınızın bir arayüz uygulamasına izin vermek daha iyi olmaz mıydı? Ardından, çalışma zamanında bir nesnenin bu arabirimi uygulayıp uygulamadığını ve dolayısıyla beklenen yönteme (veya özelliğe) sahip olup olmadığını kontrol edebilirsiniz.
public interface IMyInterface
{
void Somemethod();
}
IMyInterface x = anyObject as IMyInterface;
if( x != null )
{
x.Somemethod();
}
Bence bu tek doğru yol.
Bahsettiğiniz şey, nesnenin yönteme sahip olduğunu zaten bildiğiniz senaryolarda yararlı olan ördek yazmadır, ancak derleyici bunu kontrol edemez. Bu, örneğin COM birlikte çalışma senaryolarında kullanışlıdır. ( bu makaleye bakın)
Ördek yazmayı yansıma ile birleştirmek istiyorsanız, o zaman ördek yazmanın amacını kaçırdığınızı düşünüyorum.
DynamicObject
mı?