Yansıma ile "ToString" yöntemini çağırmak

Ben aşağıdaki gibi MethodInfo "ToString" almaya çalışıyorum:

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

Bir istisna atılıyor "Belirsiz eşleşme bulundu".

0
Yine de MyType nedir? Bu tür ToString() için aşırı yüklenmelere sahip olabilir, ancak her zaman parametresiz olana sahip olur.
katma yazar BoltClock, kaynak
ToString 'i çağırmanızın hiçbir nedeni yok mu? Her nesnenin bir tane olduğu gibi görünmek ...
katma yazar Oded, kaynak
@AdamHouldsworth - Muhtemelen, OP'den bahsetmemesine rağmen, bir şekilde ya da başka.
katma yazar Oded, kaynak
@Oded farklı bir imza ile bir birine ulaşmaya çalışıyor olabilir?
katma yazar Adam Houldsworth, kaynak

8 cevap

Yazıcınız birden fazla ToString() aşırı yüklenme içeriyor ve GetMethod hangisini istediğinizi bilmiyor.

Herhangi bir parametre almayan aşırı yüklenmeyi istediğinizi belirtmek için aşağıdaki sözdizimini kullanın:

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

Not: System.Object üzerinde ToString() tanımlandığından, bilinmeyen türde bir nesnede aramak için yansıma gerekmez:

object myObject = ...;
string s = myObject.ToString();//works
6
katma

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.

İstisna, Tostring için aşırı yüklenmelerde (yani int.ToString (dize formatı) olmakla birlikte, hangisini aradığınızı bilmeniz gerekenlerden birini çağırmaktır.

Ve üst üste gelenler gördüğünüz hatanın sebebi olur. Spesifik olmanız gerekecek.

3
katma

Argüman içermeyen birini istediğinizi belirtmeniz gerekir:

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

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

1
katma

Muhtemelen birden fazla ToString() yöntemi vardır. Örneğin double dört varyanta sahiptir ( sanal object.ToString() ve üç varyantın geçersiz kılınması)

Deneyin

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
katma

ToString() 'i geçersiz kılmak istiyorsanız gerçekten geçersiz kılma anahtar sözcüğünü kullanırsınız:

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

Aksi takdirde, gerçekten geçersiz kılmak yerine object.ToString() sürümünü saklıyorsunuz.

0
katma

Böyle bir senaryoda, yöntemin varlığını bildiğinizde (potansiyel olarak karmaşık bir dizi aşırı yüklenme ile), bir Yansıma yardımcı kitaplığı sizin için zor işi yapar.

Örneğin, Fasterflect, verilen parametreler verildiğinde "mevcut en iyi eşleşme" yi kullanarak bir yöntemi çağırmak için aşağıdakileri yapmanıza izin verir (aşağıdaki örnekte, isteğe bağlı argüman 42 yöntemi çağırırken kullanmak istediğiniz bir değeri temsil eder) ):

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

Benim tecrübelerime göre, el-kodlaması yerine iyi test edilmiş bir kütüphane kullanmak (bu örnekte, yansıma) oldukça hızlı bir şekilde ödüyor.

Feragatname: Fasterflect projesine katkıda bulunuyorum.

0
katma

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

Öncelikle, aramak istediğiniz ToString 'in geçersiz kılınmış olup olmadığını kontrol etmelisiniz: object.ToString() veya IFormattable.ToString (dize biçimi, IFormatProvider biçimProvider)) Bu davalar.

İstediğiniz ToString 'in hangi aşırı yükleneceğini seçmek için Type [] types parametresini alan GetMethod aşırı yüklenmesini kullanabilirsiniz.

Örneğin, GetMethod ("ToString"), yeni Type [] {kullanabilirsiniz. }) ToString() parametresini almak için .

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

Bu aslında benim için çalışıyor ...

Muhtemelen ToString üzerinde aşırı yüklenme (ler) var. Genel olan birden çok ToString yöntemine (aşırı yükleme) sahip olabileceğiniz için, bu çizgi birden çok ToString yöntemini döndürebilir.

Şunun gibi bir şey kullanmanız gerekir:
    GetMethod (dize adı, Tür [] türleri)

Type [], aradığınız yöntemin bir türünü içermesi durumunda (sizin durumunuzda)

(Yorumlara teşekkürler, ayrıca bundan bir şeyler öğrendim :)

0
katma
Sadece aşırı yüklenme yok ise çalışır.
katma yazar jgauffin, kaynak
Kendi kendine kod iyi. Arama parametrelerinde "ToString" adlı birden fazla yöntem bulduğunda başarısız olur: Genel | Örnek.
katma yazar Adam Houldsworth, kaynak