Mungkin menggunakan pola dinamis? Anda dapat memanggil metode / properti apa pun menggunakan kata kunci dinamis, bukan? Bagaimana memeriksa apakah metode tersebut ada sebelum memanggil myDynamicObject.DoStuff (), misalnya?
Mungkin menggunakan pola dinamis? Anda dapat memanggil metode / properti apa pun menggunakan kata kunci dinamis, bukan? Bagaimana memeriksa apakah metode tersebut ada sebelum memanggil myDynamicObject.DoStuff (), misalnya?
Jawaban:
Anda dapat menulis sesuatu seperti itu:
public static bool HasMethod(this object objectToCheck, string methodName)
{
var type = objectToCheck.GetType();
return type.GetMethod(methodName) != null;
}
Sunting: Anda bahkan dapat melakukan metode ekstensi dan menggunakannya seperti ini
myObject.HasMethod("SomeMethod");
melalui Refleksi
var property = object.GetType().GetProperty("YourProperty")
property.SetValue(object,some_value,null);
Serupa untuk metode
GetType()
sana ada metode like GetProperties()
. Ini mengembalikan array PropertyInfo
. Tetapi bagaimana saya bisa menggunakan GetProperties()
metode?
Itu adalah pertanyaan lama, tetapi saya hanya menabraknya.
Type.GetMethod(string name)
akan melempar AmbiguousMatchException jika ada lebih dari satu metode dengan nama itu, jadi kami lebih baik menangani kasus itu
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;
}
}
Bukankah lebih baik tidak menggunakan tipe dinamis apa pun untuk ini, dan biarkan kelas Anda mengimplementasikan antarmuka. Kemudian, Anda dapat memeriksa pada saat runtime apakah suatu objek mengimplementasikan antarmuka itu, dan dengan demikian, memiliki metode yang diharapkan (atau properti).
public interface IMyInterface
{
void Somemethod();
}
IMyInterface x = anyObject as IMyInterface;
if( x != null )
{
x.Somemethod();
}
Saya pikir ini adalah satu-satunya cara yang benar.
Hal yang Anda maksud adalah bebek-mengetik, yang berguna dalam skenario di mana Anda sudah tahu bahwa objek memiliki metode, tetapi kompilator tidak dapat memeriksa itu. Ini berguna dalam skenario interop COM misalnya. (periksa artikel ini )
Jika Anda ingin menggabungkan bebek-mengetik dengan refleksi misalnya, maka saya pikir Anda kehilangan tujuan mengetik bebek.
DynamicObject
?