«ToString» әдісін көрсету арқылы көрсетіңіз

MethodInfo «ToString» -ді келесідей алуға тырысамын:

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

Ерекшелігі «Бірдей ойын табылды» деп аталады.

0
Қандай жағдайда MyType дегеніміз не? Бұл түрдегі ToString() үшін жүктемелер болуы мүмкін, бірақ ол әрдайым параметрсіз болады.
қосылды автор BoltClock, көзі
Кез келген себеп сіз тек ToString деп атала алмайсыз ба? Әрбір нысанның біреуі біреуі бар екенін көре ...
қосылды автор Oded, көзі
@AdamHouldsworth - Мүмкін, ОС-ны айтпаса да, басқаша.
қосылды автор Oded, көзі
@Oded әртүрлі қолтаңбаны алуға тырысуы мүмкін бе?
қосылды автор Adam Houldsworth, көзі

8 жауаптар

Сіздің түрі бірнеше <�коды> ToString() </кодты> тиеу және <�кодты> GetMethod </коды> құрамында сіз келетін бір білмейді.

Кез келген параметрді қабылдамайтын жүктеме қажет екенін көрсету үшін келесі синтаксисті пайдаланыңыз:

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

Ескерту: System.Object жүйесінде ToString() анықталғандықтан, оны белгісіз түрдегі нысанға шақыру үшін көрсетудің қажеті жоқ:

object myObject = ...;
string s = myObject.ToString();//works
6
қосылды

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.

Тостринг үшін (мысалы, int.ToString (string format) ) жүктемелерді алып тастауға болады, бірақ қайсысын іздейтініңізді білуіңіз қажет болғандардың біреуіне қоңырау шалу.

Және бұл қателер сіз көрген қатені тудырады. Сіз нақты болуы керек.

3
қосылды

Аргументтері жоқтығын көрсетуіңіз керек:

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

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

1
қосылды

Мүмкін, біреуден көп ToString() әдістері бар. Мысалы, double төрт нұсқасы бар ( virtual object.ToString() перев.

Тырысу

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
қосылды

ToString() деген жазуды ауыстырғыңыз келсе, шынымен переопределить кілт сөзін пайдаланыңыз:

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

Олай болмаған жағдайда сіз object.ToString() нұсқасын жасырынып жатыр гөрі шын мәнінде тежеген.

0
қосылды

Осындай сценарийде әдіс бар екенін білсеңіз (ықтимал мәселелерді қиындату үшін бірнеше жүктемелер болуы ықтимал) Reflection helper library .

Мысалы, Fasterflect берілген параметрлерді ескере отырып (төмендегі мысалда, 42 қосымша әдіс әдісті қолданғанда пайдаланғыңыз келетін кейбір мәнді білдіреді) «ең жақсы қол жетімді сәйкестікті» пайдалана отырып, әдісті шақыру үшін төмендегілерді орындауға мүмкіндік береді. ):

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

Менің тәжірибемде, қолмен кодтаудың орнына жақсы тексерілген кітапхананы пайдалану (бұл жағдайда, рефлексия) өте жылдам төленеді.

Ескерту: Мен Fasterflect жобасының қатысушымын.

0
қосылды

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

Алдымен сіз ToString қоңырау шалғыңыз келгенін немесе object.ToString() немесе IFormattable.ToString (жол форматы, IFormatProvider formatProvider)) , бұл істер.

Керекті ToString таңдау үшін Түрі [] түрлері параметрін қабылдайтын GetMethod жүктемесін пайдалануға болады.

Мысалы, GetMethod («ToString», жаңа Түрі [] { }) параметрін алу үшін ToString() .

0
қосылды
MethodInfo method = typeof(MyType).GetMethod("ToString", BindingFlags.Public | BindingFlags.Instance);

Бұл шын мәнінде мен үшін жұмыс істейді ...

Сізде ToString-ке тиеуі мүмкін. Көптеген ToString әдістеріне (жүктемелерге) ие бола алатындықтан, бұл жол бірнеше ToString-әдістерін қайтаруы мүмкін.

Сізге мына нәрсені пайдалану керек:
    GetMethod (жол атауы, Түрі [] түрлері)

Мұнда Түрі [] түрлерінің массиві бар болса, сіз іздеген әдіс бар (сіздің жағдайда жоқ)

(Түсініктемелердің арқасында, осыдан да бір нәрсе үйренді :)

0
қосылды
Тек шамадан тыс жүктемелер болмаса ғана жұмыс істейді ...
қосылды автор jgauffin, көзі
Оның коды жақсы. Оның іздеу параметрлері бойынша «ToString» деп аталатын бірнеше әдісті тапқан сәтсіз болады: Public | Мәселе.
қосылды автор Adam Houldsworth, көзі