Aşağıdakileri göz önünde bulundurun:Neden her farklı dinamik çağrı iki istisna ile sonuçlanır ve bunlar bastırılabilir?
using System;
using System.Dynamic;
using System.Linq;
namespace DynamicObjectTest
{
class Program
{
static void Main(string[] args)
{
dynamic dyn = new TestDynamic();
Console.ReadKey();
foreach (var i in Enumerable.Range(0, 100))
{
Console.WriteLine(dyn.Foo());
Console.WriteLine(dyn.Bar());
}
Console.ReadKey();
}
}
class TestDynamic : DynamicObject
{
public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result)
{
if (binder.Name == "Foo")
{
result = "Bar";
return true;
}
else if (binder.Name == "Bar")
{
result = "Foo";
return true;
}
return base.TryInvokeMember(binder, args, out result);
}
}
}
Bu programı çalıştırırken, RuntimeBinderException
tipinde dört istisna atılır. Bunu, tüm atılan özel durumları (Hata Ayıklama/İstisnalar .../Ortak Dil Çalışma Zamanı Özel Durumları Atma onay kutusunu işaretle) veya perfmon kullanarak keserek gözlemleyebilirsiniz:
Artık bu istisnalar açıkça yakalanmış ve işlenmiş dahili olarak TryInvokeMember
yöntemi daha sonra çağrılır. Ancak, "istisnai durumlarda istisnai durumlar" mantığına abone olursanız, ağır ele alınmış ve istisnaların uygunsuz kullanımı gözükmektedir. Benim özel örneğim için gerçekten bir sorun değil çünkü aynı üyeler - Foo
ve Bar
- tekrar tekrar çağırılıyor. Ancak, üyelerin çok daha az statik olduğu diğer senaryolarım var.
Çalışma zamanının herhangi bir istisna atmadan TryInvokeMember
'ı çağırmasına yardımcı olacak bir şey var mı?
Yutulması muhtemel bir istisnai durum söz konusu olabilir. Neler olup bittiğini görmek için 'TryInvokeMember' kodunu kaldırabilirsiniz. – Polynomial
Onay kutusunu/atma yaklaşımını kullanırsam, aslında benim için kırılmaz. –
@Polynomial: Sorunun içinde bulunduğuna işaret ettim, ama bu benim sorum değil. –