2010-01-16 34 views
5

DynamicObject alt sınıfım var ve DO'nun açık döküm yöntemi TryConvert gibi ilkel türler için örtük döküm uygulamak istiyorum; Yani, birden fazla örtülü operatör [tip] fonksiyonu yazmadan.DynamicObject örtük döküm

Kullanımı:

dynamic myDynamicObject = new MyDynamicObject("1"); 
int sum = 1 + myDynamicObject; // instead of int i = 1 + (int)myDynamicObject; 

mümkün ve eğer öyleyse, nasıl mı?

cevap

5

Burada birkaç şey var.

İlk olarak, ikili bir işlem gerçekleştiriyorsunuz. Yani, TryBinaryOperation yöntemini de geçersiz kılmanız gerekir. Dönüşümden önce ilk önce çağrılacak. Daha sonra TryBinaryOperation yönteminden bir dönüşüm gerçekleştirebilirsiniz. Böyle bir ifade yaz yalnızca TryBinaryOperation denir Sebebi ne olursa olsun

İkincisi,:

Şimdi gördüğüm kadarıyla
int sum = myDynamicObject + 1; 

, sırası önemlidir. Hata veya amaçlanan bir davranış olup olmadığını DLR ekibiyle kontrol edeceğim.

Güncelleme: Bu bir hata değildir. Hem "1 + myDynamicObject" hem de "myDynamicObject + 1" i desteklemek için sadece TryBinaryOperation'a değil, aynı zamanda mevcut DynamicObject'in sahip olmadığı TryBinaryOperationFromRight'a da ihtiyacınız var.

+0

"1 + myDynamicObject" senaryosunda örtülü yayınla, cast türünde sol taraf işlemini kullanır; bu durumda ints işlemi + (int, int). Ama evet, TryBinaryOperation sadece sol taraftaki işlemleri destekliyor. Bu nedenle, açık döküm için TryConvert olarak benzer türdeki gizli döküm yöntemi çok yararlı olacaktır. –

+0

TryConvert aslında hem örtülü hem de açık döküm işlemini desteklemektedir. Örneğin, bu iyi çalışır: "int sum = myDynamicObject;" TryConvert'ı geçersiz kılarsanız. Ama ikili bir işlem yaptığınızda (ve sanırım bir de sanırım), TryConvert yöntemi çağrılmaz. [email protected] adresine yazmanızı ve kullanım durumunuzu burada açıklamanızı öneririm. Bir hata olabilir ya da arkasındaki bazı tasarımlar mantıklı olabilir, bu da ekibin benden daha iyi açıklayabileceğidir. –

3

DLR-takımı sorumu yanıtladı ve DO'nun sağ işlenen olduğunda mümkün olmadığını söyledi.

Yanıtlarından alıntı: "Öncelikli kural, dinamik işlem protokolünün yalnızca bu konumdaki dinamik nesne ile çalıştığı için dinamik nesnenin soldaki işleneni olması gerektiğidir."

Soldaki örtük döküm, TryBinaryOperation ile yapılabilir, ancak bunun için desteklenen operatörleri (+, -, ...) da uygulamanız gerekir.