This is limitation of C# being a strongly typed language and the way
DynamicProxy works internally to try to overcome that limitations.
However, if you're needing this for WPF databinding, there might be a
solution, although it's not yet implemented, and will be part of
Dynamic Proxy 3.
Take a look at Type Wrapping section:
http://using.castleproject.org/display/CASTLE/Dynamic+Proxy+3+design+meeting

Currently you would have to manually disassemble your first mixin
before mixing it again.
Something like this: http://gist.github.com/214125

HTH,
Krzysztof

On 20 Paź, 10:52, serious <[email protected]> wrote:
> Thanks for your quick answer Krzysztof.
>
> [quote]Can't you just mix in all elements at once?[/quote]
>
> If you mean :
> [code]
> ProxyGenerationOptions optionsAB = new ProxyGenerationOptions();
> optionsAB.AddMixinInstance(new ADefaultImplementation());
> optionsAB.AddMixinInstance(new BDefaultImplementation());
> IB ab = _proxyGenerator.CreateClassProxy(typeof(C), null, optionsAB)
> as IB;
> [/code]
> no I can't.
>
> [quote]What is your specific scenario here?[/quote]
>
> Somewhere in my application I'm using DynamicProxy's mixins in a WPF
> custom DataGrid that dynamically add a "IsSelected" property to the
> entities : [Entity] -> [Entity+IsSelected]
> It works like a charm.
>
> Elsewhere in my code, for a different purpose, I enrich some entities
> with a new property, "Name", by using mixins too :
> [Entity] -> [Entity+Name].
> It also works perfectly.
>
> Now I need to pass these enrich entities, which are proxies then, to
> the custom datagrid, which will try to generate a proxy for the
> entities, causing the issue.
>
> Is it a definitive limitation, due to the .Net framework, or could it
> be overcome ?
>
> On 20 oct, 10:23, Krzysztof Koźmic (2) <[email protected]> wrote:
>
> > it's not really a bug - it's an unsupported scenario.
> > new DynamicProxy (version 2.2 from development branch) detects it and
> > throws meaningful exception ("Are you trying to proxy an existing
> > proxy?").
> > Can't you just mix in all elements at once? What is your specific
> > scenario here?
>
> > On 20 Paź, 10:16, serious <[email protected]> wrote:
>
> > > Hello,
>
> > > say I have an object and I want to obtain a new one whose class is a
> > > mixin of the object's class and some simple implementations of two
> > > interfaces.
>
> > > Here is what I do :
> > > [code]
> > > using System;
>
> > > using System.Reflection;
>
> > > using Castle.DynamicProxy;
>
> > > namespace Test
> > > {
> > >     public interface IA
> > >     {
> > >         string SA
> > >         {
> > >             get;
> > >             set;
> > >         }
> > >     }
>
> > >     public interface IB
> > >     {
> > >         string SB
> > >         {
> > >             get;
> > >             set;
> > >         }
> > >     }
>
> > >     public class ADefaultImplementation : IA
> > >     {
> > >         public string SA
> > >         {
> > >             get;
> > >             set;
> > >         }
> > >     }
>
> > >     public class BDefaultImplementation : IB
> > >     {
> > >         public string SB
> > >         {
> > >             get;
> > >             set;
> > >         }
> > >     }
>
> > >     public class C
> > >     {
> > >     }
>
> > >     public class Application
> > >     {
> > >         private static void Main()
> > >         {
> > >             ProxyGenerator _proxyGenerator = new ProxyGenerator();
>
> > >             // Creation of the first mixin instance "mixin1 = C +
> > > ADefaultImplementation"
> > >             ProxyGenerationOptions optionsA = new
> > > ProxyGenerationOptions();
> > >             optionsA.AddMixinInstance(new ADefaultImplementation());
> > >             IA a = _proxyGenerator.CreateClassProxy(typeof(C), null,
> > > optionsA) as IA;
>
> > >             // Creation of the second mixin instance "mixin2 = mixin1
> > > + BDefaultImplementation"
> > >             ProxyGenerationOptions optionsB = new
> > > ProxyGenerationOptions();
> > >             optionsB.AddMixinInstance(new BDefaultImplementation());
> > >             IB b = _proxyGenerator.CreateClassProxy(a.GetType(), null,
> > > optionsB) as IB;
>
> > >             Console.WriteLine(b.SB); // OK
> > >             Console.WriteLine((b as IA).SA); // KO
> > >         }
> > >     }}
>
> > > [/code]
> > > But trying to access "SA" raises the following exception :
> > > [code]
> > > System.NullReferenceException was unhandled
> > >   Message="Object reference not set to an instance of an object."
> > >   Source="DynamicProxyGenAssembly2"
> > >   StackTrace:
> > >        at
> > > CProxy43c7f990b4df48bfaa238358baeb0bcf.Invocationget_SA_1.InvokeMethodOnTarget
> > > ()
> > >        at Castle.DynamicProxy.AbstractInvocation.Proceed()
> > >        at Castle.Core.Interceptor.StandardInterceptor.Intercept
> > > (IInvocation invocation)
> > >        at Castle.DynamicProxy.AbstractInvocation.Proceed()
> > >        at CProxy43c7f990b4df48bfaa238358baeb0bcf.get_SA()
> > >        at
> > > CProxy43c7f990b4df48bfaa238358baeb0bcfProxy3475609451fe4a69beb6ace21633e3e2.get_SA_callback_4
> > > ()
> > >        at
> > > CProxy43c7f990b4df48bfaa238358baeb0bcfProxy3475609451fe4a69beb6ace21633e3e2.Invocationget_SA_4.InvokeMethodOnTarget
> > > ()
> > >        at Castle.DynamicProxy.AbstractInvocation.Proceed()
> > >        at
> > > CProxy43c7f990b4df48bfaa238358baeb0bcfProxy3475609451fe4a69beb6ace21633e3e2.get_SA
> > > ()
> > >        at Test.Application.Main() in H:\p\test\wpf\TestForum\TestForum
> > > \Program.cs:line 67
> > >        at System.AppDomain._nExecuteAssembly(Assembly assembly, String
> > > [] args)
> > >        at System.AppDomain.ExecuteAssembly(String assemblyFile,
> > > Evidence assemblySecurity, String[] args)
> > >        at
> > > Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
> > >        at System.Threading.ThreadHelper.ThreadStart_Context(Object
> > > state)
> > >        at System.Threading.ExecutionContext.Run(ExecutionContext
> > > executionContext, ContextCallback callback, Object state)
> > >        at System.Threading.ThreadHelper.ThreadStart()
> > >   InnerException:
> > > [/code]
>
> > > Unfortunately notice that I can't use some basic working workarounds
> > > like :
> > > - using a unique mixin base "ABDefaultImplementation" with the two
> > > fields "SA" and "SB" this way :
> > > [code]
> > > public class ABDefaultImplementation : IA, IB
> > > {
> > >         public string SA
> > >         {
> > >                 get;
> > >                 set;
> > >         }
>
> > >         public string SB
> > >         {
> > >                 get;
> > >                 set;
> > >         }}
>
> > > ...
> > > ProxyGenerationOptions optionsAB = new ProxyGenerationOptions();
> > > optionsAB.AddMixinInstance(new ABDefaultImplementation());
> > > IB ab = _proxyGenerator.CreateClassProxy(typeof(C), null, optionsAB)
> > > as IB;
> > > [/code]
> > > - generating the final mixin object with a unique call to
> > > "CreateClassProxy" :
> > > [code]
> > > ProxyGenerationOptions optionsAB = new ProxyGenerationOptions();
> > > optionsAB.AddMixinInstance(new ADefaultImplementation());
> > > optionsAB.AddMixinInstance(new BDefaultImplementation());
> > > IB ab = _proxyGenerator.CreateClassProxy(typeof(C), null, optionsAB)
> > > as IB;
> > > [/code]
>
> > > Am I doing something wrong, is it a bug, or a known limitation ?
> > > The used version of "DynamicProxy" is 2.1.
>
> > > Thanks by advance for your help.
>
> > > Best regards.
>
>
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Castle Project Users" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to 
[email protected]
For more options, visit this group at 
http://groups.google.com/group/castle-project-users?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to