"ToString" usulini ko'zgu bilan chaqiring

MethodInfo "ToString" ni quyidagi kabi olishga harakat qilaman:

MethodInfo method = MyType.GetMethod("ToString", 
                                     BindingFlags.Public | BindingFlags.Instance);

"Hech qanday noma'lum o'yin" topilmadi.

0
Baribir, MyType nima? Bunday turdagi ToString() uchun ortiqcha yuk bo'lishi mumkin, lekin har doim parametrsiz bo'ladi.
qo'shib qo'ydi muallif BoltClock, manba
Faqatgina ToString deb ataladigan har qanday sabab? Har bir narsaning ko'rinishi bitta ...
qo'shib qo'ydi muallif Oded, manba
@AdamHouldsworth - Ehtimol, OP O'ZDAN so'zlashmasa ham, u yoki bu tarzda.
qo'shib qo'ydi muallif Oded, manba
@Oded boshqa bir imzo bilan ishlashga harakat qilishi mumkinmi?
qo'shib qo'ydi muallif Adam Houldsworth, manba

8 javoblar

Sizning turingizda bir nechta ToString() ortiqcha yuklari va GetMethod o'z ichiga oladi.

Hech qanday parametr qabul qilmaydigan ortiqcha yuklamoqchi bo'lganingizni aniqlash uchun quyidagi sintaksikidan foydalaning:

MethodInfo method = myType.GetMethod("ToString", Type.EmptyTypes); 

Eslatma: System.Object ustida ToString() aniqlanganligi sababli noma'lum turdagi ob'ektga qo'ng'iroq qilish uchun aks ettirish shart emas:

object myObject = ...;
string s = myObject.ToString();//works
6
qo'shib qo'ydi

ToString() is a member of System.Object and thus it is one of the very few methods that you don't need reflection for when you wat to call it on an unknown Type.

Istisno Tostring (ya'ni, int.ToString (string format) ) uchun ortiqcha yuklarda, lekin qidirayotganingizni bilishingiz kerak bo'lgan narsalardan birini chaqirish uchun.

Va bu qopqonlar siz ko'rgan xatolarga sabab bo'ladi. Siz aniq bo'lishi kerak.

3
qo'shib qo'ydi

Hech qanday argumentlarga ega bo'lmaslikni xohlaysiz.

var method = MyType.GetMethod("ToString", 
                              new Type[0]);

BindingFlags.Public | BindingFlags.Instance is the default values, no need to specify them.

1
qo'shib qo'ydi

Ehtimol, bir nechta ToString() usullari mavjud. Masalan, double to'rt varianti ( virtual object.ToString() ortiqcha uchta variantni bekor qilish)

Ushlab ko'ring

var variants = MyType.GetMethods(BindingFlags.Public | BindingFlags.Instance)
               .Where(p => p.Name == "ToString");

it will return all the variants of ToString

or, if you know the parameters of "your" ToString

var toString = MyType.GetMethod("ToString", 
               BindingFlags.Public | BindingFlags.Instance, 
               null, arrayOfParametersType, null);
1
qo'shib qo'ydi

Agar ToString() kodini bekor qilmoqchi bo'lsangiz, albatta, bekor qil kalit so'zini ishlatasiz:

class MyType
{
     public override string ToString()
     {
         return "Whatever";
     }
 }

Aks holda object.ToString() versiyasini aslida bekor qilmasdan yashirasiz.

0
qo'shib qo'ydi

Bu kabi senariyda, usul mavjudligini bilganingizda (potentsial masalalarni murakkablashtirish uchun bir nechta yuklanishlar bo'lishi mumkin), Ko'paytirish yordamchi kutubxonasi sizning mashaqqatli ishingizni qilmoqda.

Misol uchun, Fasterflect sizga taqdim etilgan parametrlarni hisobga olgan holda "eng yaxshi mos keladigan ma`lumotlar" dan foydalanib usulni chaqirish uchun quyidagilarni amalga oshirishga imkon beradi (quydagi misolda ixtiyoriy argument 42 uslubni qo'llashda foydalanmoqchi bo'lgan qiymatni ifodalaydi) ):

var obj = ...
var result = obj.TryCallMethodWithValues( "ToString", 42 );

Mening tajribamda qo'l kodlash o'rniga yaxshi testlangan kutubxonani ishlatish (bu holda, aks ettirish) juda tezlik bilan to'lanadi.

Voz kechish: Men Fasterflect loyihasining ishtirokchisiman.

0
qo'shib qo'ydi

ToString can be overloaded. And on many types it is.

Avval siz qo'ng'iroq qilishni istagan ToString yoki object.ToString() yoki IFormattable.ToString (string tartibi, IFormatProvider formatProvider)) . bu holatlar.

Kerakli ToString ni tanlash uchun Type [] types parametrini olgan GetMethod ning ortiqcha yuklanishidan foydalanishingiz mumkin.

Masalan, GetMethod ("ToString", yangi toifa [] { }) parametrsiz ToString() ni olish uchun.

0
qo'shib qo'ydi
MethodInfo method = typeof(MyType).GetMethod("ToString", BindingFlags.Public | BindingFlags.Instance);

Bu aslida men uchun ishlaydi ...

Sizga ToStringda haddan tashqari yuk (lar) bo'lishi mumkin. Ommaviy bo'lgan bir nechta ToString usullari (ortiqcha yuklamalar) bo'lishi mumkin, chunki bu qator bir nechta ToString usullarini qaytarishi mumkin.

Siz kabi narsalarni ishlatishingiz kerak:
    GetMethod (string nomi, [] toifa]

Qaerda [] turidagi qatorlar mavjud bo'lsa, siz izlayotgan usulda (sizda hech qanday)

(Fikrlar tufayli, shuningdek, bu narsadan nimadir o'rgandi :)

0
qo'shib qo'ydi
Faqat ortiqcha yuklamasdan ishlaydi ...
qo'shib qo'ydi muallif jgauffin, manba
Uning kodi yaxshi. "ToString" deb nomlangan bir necha metodni qidirish parametrlari doirasida topsa: Public Masala.
qo'shib qo'ydi muallif Adam Houldsworth, manba