2011-07-15 29 views
10

DynamicObject'ten türeyen bir sınıfı tanımlayabilir ve arabirimde her yöntemi uygulamak zorunda kalmadan bir arabirimi (ICanDoManyThings) destekleyebilir miyim?Bir Arabirimi destekleyen bir DynamicObject oluşturmanın bir yolu var mı?

Dinamik bir proxy nesnesi oluşturmaya çalışıyorum ve bu sınıftaki yöntem çağrısının MyProxyClass.TryInvokeMember uygulamasının işlenmesini isteyip istemediğinizi veya sarılmış bir nesneye iletemeyebilirim.

Bu mümkün mü?

Teşekkür

Clay ile

cevap

7

ImpromptuInterface tam olarak bunu yapar ve DynamicObject alt sınıfları ve ExpandoObject gibi ANY IDynamicMetaObjectProvider ile çalışır.

using ImpromptuInterface; 
using ImpromptuInterface.Dynamic; 

public interface IMyInterface{ 

    string Prop1 { get; } 

    long Prop2 { get; } 

    Guid Prop3 { get; } 

    bool Meth1(int x); 
} 

...

//Dynamic Expando object 
dynamic tNew = Build<ExpandoObject>.NewObject(
     Prop1: "Test", 
     Prop2: 42L, 
     Prop3: Guid.NewGuid(), 
     Meth1: Return<bool>.Arguments<int>(it => it > 5) 
); 

IMyInterface tActsLike = Impromptu.ActLike<IMyInterface>(tNew); 

Linfu aslında DLR tabanlı nesneler kullanın ve daha çok bunu bir CİDDİ performans maliyetini veren naif geç bağlama kendinizinki kullanır olmayacaktır. Clay, dlr'ı kullanır, ancak tüm davranışları her zaman basit olmayan bir ClayObject'e enjekte etmeniz için tasarlanan Clay nesneleri ile uğraşmanız gerekir.

+0

Eğer kendi expando'mı yazıp 'ActLike''ı çağırırsam bu işe yarar mı? Gibi, dinamik tNew = yeni ExpandoObject(); tNew.Prop1 = "Test"; ... ... vb ... ve "Impromptu.ActLike (tNew);"? – nawfal

+1

Evet, herhangi bir 'IDynamicMetaObjectProvider' ile çalışır, çünkü C#' 'dinamik' anahtar sözcüğü ai kullanır. – jbtule

3

yapabilirsiniz.

Bir örnek:

public interface IMyInterface 
{ 
    string Prop1 { get; } 

    long Prop2 { get; } 

    Guid Prop3 { get; } 

    Func<int, bool> Meth { get; } 
} 

//usage: 

dynamic factory = new ClayFactory(); 
var iDynamic = factory.MyInterface 
(
    Prop1: "Test", 
    Prop2: 42L, 
    Prop3: Guid.NewGuid(), 
    Meth: new Func<int, bool>(i => i > 5) 
); 

IMyInterface iStatic = iDynamic; 

This article bunu başarmak için birkaç farklı yöntem sunmaktadır.

+0

ClaySharp'ı Clay'den ziyade Clay'den daha iyi kurmak gerekir çünkü ikincisi Castle.Core projesine bağımlıdır (maalesef en son Castle.Core ile birlikte çalışmamaktadır). – nawfal

+0

Clay, büyük bir esneklik sunarken, Impromptu'nun yaklaşımını beğeniyorum. Oldukça basit. Başka bir durum, Clay, yöntemleri olan arayüzlerle iyi oynamaz. – nawfal

İlgili konular