Выклік метаду «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); 

Заўвага: Так як ToString() вызначаны на System.Object , вам не трэба адлюстравання называць яго на аб'ект невядомага тыпу:

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.

Выключэнне складае ў перагрузкамі для ToString (г.зн. int.toString (радок фармату) але назваць адным з тых, каго вы павінны ведаць, які з іх вы шукаеце.

І гэта overlaods выклікаць памылку, якую вы бачыце. Вы павінны быць канкрэтнымі.

3
дададзена

Неабходна ўказаць, што вы хочаце, адзін без аргументаў:

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

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

1
дададзена

Магчыма, ёсць больш чым адзін ToString() метады. Напрыклад двайны мае чатыры варыянты (на пераазначэнне віртуальны 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 памочнік , што робіць цяжкую працу за вас.

Напрыклад, 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() або (фармат радкі, IFormatProvider formatProvider) IFormattable.ToString) , так як вы можаце проста пазбегнуць адлюстравання ў гэтыя выпадкі.

Вы можаце выкарыстоўваць перагрузку GetMethod , які прымае Увядзіце [] тыпы <�код /> параметр, каб выбраць, якія перагрузкі ToString вы хочаце.

Напрыклад, вы можаце выкарыстоўваць GetMethod ( "ToString", новы тып [] { }) , каб атрымаць без параметраў ToString() .

0
дададзена
MethodInfo method = typeof(MyType).GetMethod("ToString", BindingFlags.Public | BindingFlags.Instance);

Гэта на самай справе працуе для мяне ...

Вы, верагодна, перагрузкі (ы) на ToString. Так як вы можаце мець некалькі метадаў ToString (перагрузкі), якія з'яўляюцца дзяржаўнымі, гэтая лінія можа вяртаць некалькі ToString-метады.

Вы павінны былі б выкарыстоўваць нешта накшталт:
    GetMethod (імя радкі, тып [] тыпы)

Дзе Type [] змяшчае масіў тыпаў метаду, які вы шукаеце мае (у вашым выпадку няма)

(Дзякуючы каментарах, а таксама даведаліся нешта з гэтага :)

0
дададзена
Працуе толькі калі толькі няма перагрузкі ...
дададзена аўтар jgauffin, крыніца
На гэта ўласны код добра. Ён трывае няўдачу, калі ён знаходзіць больш чым адзін метад, званы «ToString» у межах сваіх параметраў пошуку: Public | Instance.
дададзена аўтар Adam Houldsworth, крыніца