Özellikle özel üyelere yansıma yanlış
- Yansıma, güvenlik türünü bozar. Var olmayan bir yöntemi (artık) ya da yanlış parametrelerle ya da çok fazla parametreyle ya da yeterli değil ... hatta yanlış sırada (bu benim favorim :)) çağırmayı deneyebilirsiniz. Bu arada dönüş tipi de değişebilir.
- Yansıma yavaş.
Özel üyelerin yansıması, kapsülleme ilkesini ihlal eder ve böylece kodunuzu aşağıdakilere maruz bırakır:
- Kodunuzun karmaşıklığını artırın çünkü sınıfların iç davranışlarını işlemek zorundadır. Gizli olan gizli kalmalıdır.
- Kodunuzun derleneceğinden kırılmasını kolaylaştırır, ancak yöntem adını değiştirdiğinde çalışmaz.
- Özel kodun kırılmasını kolaylaştırır, çünkü özel ise bu şekilde adlandırılması amaçlanmamıştır. Belki de özel yöntem çağrılmadan önce bazı içsel durum bekler.
Yine de yapsam ne olur?
Bu nedenle, üçüncü bir tarafa bağımlı olduğunuzda veya açıkta olmayan bir API'ye ihtiyacınız olduğunda, biraz düşünmeniz gerekir. Bazıları da sahip oldukları bazı sınıfları test etmek için kullanırlar, ancak sadece testler için iç üyelere erişim sağlamak için arabirimi değiştirmek istemezler.
Eğer yaparsan, doğru yap
- Kırılması kolay hafifletmek:
Kolay kırılma sorununu hafifletmek için en iyisi, sürekli entegrasyon derlemesinde veya benzeri bir şekilde çalışacak birim testlerinde test ederek olası bir kopukluğu tespit etmektir. Tabii ki, her zaman aynı montajı kullandığınız anlamına gelir (özel üyeleri içerir). Dinamik bir yük ve yansıma kullanıyorsanız, ateşle oynamayı seversiniz, ancak her zaman çağrının üretebileceği İstisnayı yakalayabilirsiniz.
- Yansımanın yavaşlığını azaltın:
Net Framework'ün son sürümlerinde, CreateDelegate MethodInfo tarafından çağrılan bir faktör 50'yi geçmiştir:
// The following should be done once since this does some reflection
var method = this.GetType().GetMethod("Draw_" + itemType,
BindingFlags.NonPublic | BindingFlags.Instance);
// Here we create a Func that targets the instance of type which has the
// Draw_ItemType method
var draw = (Func<TInput, Output[]>)_method.CreateDelegate(
typeof(Func<TInput, TOutput[]>), this);
draw
çağrılar, standart olarak MethodInfo.Invoke
kullanılmasından yaklaşık 50 kat daha hızlı olacaktır :draw
Func
var res = draw(methodParams);
Bu kontrol mayın görevini farklı metot çağrımı üzerinde kriter görmek için