2012-03-16 26 views
6

şimdi ama neden merak için çalışan buYansıma

foreach(var field in tgt.GetFields()){ 
    var pv = o.InvokeMember(field.Name, System.Reflection.BindingFlags.GetProperty, null, o, null); 
    i.SetValue(rc, pv); 
} 

başvurmak zorunda POCO en bir Microsoft Office nesne için bir mapper oluşturmak için çalışıyorum ve bu

// doesn't work 
// returns an empty array where o is a RCW on an office object 
foreach(var pi in o.GetType().GetProperties()) 
    tgt.SetValue(rc, pi.GetValue(o, null)); 

bulundu nesneleri RCW.GetProperties() burada çalışmıyor mu?

cevap

17

diğer iki cevaplar doğru, ancak bir COM nesnesinin geç bağlama NET tipi sisteminin açıdan nasıl göründüğü açıklamak için önemli bir fırsat özledim. COM nesnesinde GetType'u çağırdığınızda, dönüş değeri, birlikte çalışma kodu yazarken normalde çalıştığınız COM arabirimi türü değil, __ComObject iç türüdür. Bunu hata ayıklayıcıda veya Console.WriteLine(o.GetType().Name); gibi bir kodla görebilirsiniz.

__ComObject tipi bir özellikleri vardır; Bu nedenle, o.GetType().GetProperties() numaralı telefonu aradığınızda boş bir dizi alırsınız. (En azından hayattaki bazı şeyler mantıklı!)

InvokeMember yöntemini yeniden derlerseniz, COM nesnelerini özel bir şekilde ele aldığını görürsünüz, bu çağrı dahili bir yerel yönteme aktarılır. "Normal" .NET nesneleri için, yöntem "normal" .NET yansımasını kullanır, istenen üye için uygun MemberInfo'u alır ve çağırır. arayüzü türüne

Sen can kullanım .NET yansıması. Örneğin, nesnenin bir Excel Worksheet olduğunu biliyorsanız, typeof(Worksheet).GetProperties()'u kullanabilir ve ortaya çıkan PropertyInfo örneklerini nesnenizle kullanabilirsiniz. Ancak, derleme zamanında nesnenin türünü bilmiyorsanız, örnek kodunuzda olduğu gibi GetType() numaralı telefonu aramanız gerekir. Bu durumda, InvokeMember'u kullanarak kaldınız.

3

Bu COM nesnesinin son olarak bağlı olmasıdır. Çalışma zamanı, bir COM nesnesine erişilinceye/çağrılana kadar hangi yöntemlerin/özelliklerin kullanılabileceğini bilmez. İşte

konuda bazı iyi haberler şunlardır:

http://support.microsoft.com/default.aspx?scid=kb;en-us;Q302902

Ne vasıfları son zamanlarda bağlı nesne bilmenin bir yolu yoktur edecektir çünkü Type.InvokeMember(propertyName, BindingFlags.GetProperty, binder, target, args) kullanarak onları isimleriyle belirtmek gerekir

http://www.codeproject.com/Articles/10838/How-To-Get-Properties-and-Methods-in-Late-Binding

1

derleme zamanı. Bunun yerine, bu aramayı çalışma zamanında, genellikle dize karşılaştırmasıyla gerçekleştirmeniz gerekir. Eğer derleme zamanında özellikleri ve konumlarını belirlemek eğer

RCW.GetProperties()

sadece çalışacak. bu yazı olarak