namespace DynamicProxyTest
{
internal class LookupPropertyInterceptor : IInterceptor
{
public void Intercept(IInvocation invocation)
{
string propertyName = invocation.Method.Name.Substring(4);
var attributes =
(LookupProperty[])invocation.Proxy.GetType().GetProperty(propertyName)
.GetCustomAttributes(typeof(LookupProperty), true);
bool isLookup = attributes.OfType<LookupProperty>().Any();
if (!isLookup)
{
invocation.Proceed();
return;
}
if (invocation.Method.Name.StartsWith("set_",
StringComparison.OrdinalIgnoreCase) &&
attributes[0] != null
)
{
//var property = ((LookupProperty)attributes[0]);
var obj = invocation.Proxy;
Console.WriteLine(invocation.Arguments[0]);
}
if (invocation.Method.Name.StartsWith("get_",
StringComparison.OrdinalIgnoreCase)/* &&
attributes.Count == 1*/
)
{
//var property = ((LookupProperty)attributes[0]);
var obj = invocation.Proxy;
}
invocation.Proceed();
}
}
[Entity("Test")]
public class MyModel
{
private static readonly ProxyGenerator _generator = new
ProxyGenerator();
public static T MakeModel<T>() where T : class, new()
{
var proxy = _generator.CreateClassProxy<T>(new
LookupPropertyInterceptor());
return proxy;
}
[LookupProperty("SomeLookup", "SomeOtherEntity")]
public virtual int X { get; set; }
}
class Program
{
static void Main(string[] args)
{
var proxy = MyModel.MakeModel<MyModel>();
proxy.X = 5;
MyModel m = new MyModel();
var xxx = (LookupProperty[])m.GetType().GetProperty("X")
.GetCustomAttributes(typeof(LookupProperty), true);;
Console.ReadLine();
}
}
}
Turns out the proxy doesn't copy the attributes.
I had to refer to the TargetingType.
Is this a bug?
2010/8/10 Krzysztof Koźmic <[email protected]>
> It makes the source code far less readable and tends to not get maintained
> once written.
>
>
> On 10/08/2010 10:17 PM, omer katz wrote:
>
> Why do you think it's noise?
>
> 2010/8/10 Krzysztof Koźmic <[email protected]>
>
>> none.
>>
>> XML comments in code are usually noise and Dynamic Proxy is actually one
>> of very few places in Castle project that does have them.
>>
>>
>>
>>
>> On 10/08/2010 9:58 PM, omer katz wrote:
>>
>> It's much more comfortable to have them generated to webpages.
>> What auto-generation docs are you guys using?
>>
>> 2010/8/10 Krzysztof Koźmic <[email protected]>
>>
>>> plus you get xml docs on the interface if it wasnt obvious enough
>>> /// <summary>
>>> /// Encapsulates an invocation of a proxied method.
>>> /// </summary>
>>> public interface IInvocation
>>> {
>>> /// <summary>
>>> /// Gets the proxy object on which the intercepted method is
>>> invoked.
>>> /// </summary>
>>> /// <value>Proxy object on which the intercepted method is
>>> invoked.</value>
>>> object Proxy { get; }
>>> ...
>>>
>>>
>>> On 10/08/2010 9:12 PM, omer katz wrote:
>>>
>>> Is it invocation.Proxy?
>>> It's pretty annoying that the API is not documented.
>>>
>>> 2010/8/10 Ken Egozi <[email protected]>
>>>
>>>> you've got (at least) two options at your disposal:
>>>> a. the invocation object has a reference to the object it was running on
>>>> (I don't remember the name of the reference by heart). you can then grab
>>>> the
>>>> dictionary from there using reflection
>>>> a'. better yet, have the dictionary be an explicitly implemented
>>>> interface, and get typed access for it in the interceptor, without
>>>> polluting
>>>> your entity's API
>>>> b. you could also keep the dictionary on the interceptor instance (and
>>>> make sure you have interceptor per entity and not as singleton) which will
>>>> make accessing it a breeze.
>>>> example for something similar can be seen here:
>>>> http://daniel.wertheim.se/2010/02/05/getting-started-with-mongodb-using-json-net-and-castle-dynamic-proxy/
>>>>
>>>>
>>>> On Tue, Aug 10, 2010 at 12:20 PM, omer katz <[email protected]> wrote:
>>>>
>>>>> So I've gotten this far:
>>>>>
>>>>>> internal
>>>>>> class LookupPropertyInterceptor : IInterceptor
>>>>>>
>>>>>> {
>>>>>> public void Intercept(IInvocation invocation)
>>>>>>
>>>>>> {
>>>>>> if (invocation.Method.Name.StartsWith("set_",
>>>>>> StringComparison.OrdinalIgnoreCase) &&
>>>>>>
>>>>>> invocation.Method.GetCustomAttributes(
>>>>>> typeof(LookupProperty), true).ToList().Count == 1)
>>>>>>
>>>>>> {
>>>>>>
>>>>>> var property = ((LookupProperty)
>>>>>> invocation.Method.GetCustomAttributes(typeof(LookupProperty), true
>>>>>> ).ToList()[0]); // Handle property here
>>>>>> }
>>>>>>
>>>>>> if (invocation.Method.Name.StartsWith("get_",
>>>>>> StringComparison.OrdinalIgnoreCase) &&
>>>>>>
>>>>>> invocation.Method.GetCustomAttributes(
>>>>>> typeof(LookupProperty), true).ToList().Count == 1)
>>>>>>
>>>>>> {
>>>>>>
>>>>>> var
>>>>>>
>>>>> property = ((LookupProperty) invocation.Method.GetCustomAttributes(
>>>>> typeof(LookupProperty), true).ToList()[0]); // Handle property here
>>>>>
>>>>> }
>>>>>
>>>>> invocation.Proceed();
>>>>>
>>>>> }
>>>>>
>>>>> }
>>>>>
>>>>> Now how do I handle the setting and getting to the dict dictionary from
>>>>> the source object?
>>>>>
>>>>> 2010/8/10 Ken Egozi <[email protected]>
>>>>>
>>>>>> while intercepting you have access to the intercepted MethodInfo.
>>>>>> from there to the attributes set on that method the road is clear
>>>>>>
>>>>>> On Tue, Aug 10, 2010 at 11:26 AM, omer katz <[email protected]>wrote:
>>>>>>
>>>>>>> Hello,
>>>>>>> I am reading Krzysztof Koźmic's tutorial about Dynamic Proxy and I
>>>>>>> can't figure out how to intercept all properties that have some custom
>>>>>>> attribute.
>>>>>>>
>>>>>>> Example:
>>>>>>>
>>>>>>>> [
>>>>>>>> Entity("MyEntityName")] public class MyEntity
>>>>>>>>
>>>>>>>> {
>>>>>>>> private Dictionary<string, object> dict = new Dictionary<string,
>>>>>>>> object>();
>>>>>>>>
>>>>>>>> [
>>>>>>>> LookupProperty("SomeOtherEntityName")] public virtual
>>>>>>>> SomeOtherEntity SomeOtherEntity { get; set; }
>>>>>>>>
>>>>>>>> }
>>>>>>>>
>>>>>>> In the end result I would like SomeOtherEntity to access the dict
>>>>>>> dictionary with "SomeOtherEntityName" as the key.
>>>>>>>
>>>>>>> Is it possible? How can it be done?
>>>>>>> --
>>>>>>> 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]<castle-project-users%[email protected]>
>>>>>>> .
>>>>>>> For more options, visit this group at
>>>>>>> http://groups.google.com/group/castle-project-users?hl=en.
>>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>> --
>>>>>> Ken Egozi.
>>>>>> http://www.kenegozi.com/blog
>>>>>> http://www.delver.com
>>>>>> http://www.musicglue.com
>>>>>> http://www.castleproject.org
>>>>>> http://www.idcc.co.il - הכנס הקהילתי הראשון למפתחי דוטנט - בואו
>>>>>> בהמוניכם
>>>>>> --
>>>>>> 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]<castle-project-users%[email protected]>
>>>>>> .
>>>>>> For more options, visit this group at
>>>>>> http://groups.google.com/group/castle-project-users?hl=en.
>>>>>>
>>>>>
>>>>> --
>>>>> 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]<castle-project-users%[email protected]>
>>>>> .
>>>>> For more options, visit this group at
>>>>> http://groups.google.com/group/castle-project-users?hl=en.
>>>>>
>>>>
>>>>
>>>>
>>>> --
>>>> Ken Egozi.
>>>> http://www.kenegozi.com/blog
>>>> http://www.delver.com
>>>> http://www.musicglue.com
>>>> http://www.castleproject.org
>>>> http://www.idcc.co.il - הכנס הקהילתי הראשון למפתחי דוטנט - בואו
>>>> בהמוניכם
>>>>
>>> --
>>> 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]<castle-project-users%[email protected]>
>>> .
>>> For more options, visit this group at
>>> http://groups.google.com/group/castle-project-users?hl=en.
>>> --
>>> 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.
>>>
>>>
>>> --
>>> 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]<castle-project-users%[email protected]>
>>> .
>>> For more options, visit this group at
>>> http://groups.google.com/group/castle-project-users?hl=en.
>>>
>> --
>> 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.
>>
>>
>> --
>> 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]<castle-project-users%[email protected]>
>> .
>> For more options, visit this group at
>> http://groups.google.com/group/castle-project-users?hl=en.
>>
> --
> 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.
>
>
> --
> 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]<castle-project-users%[email protected]>
> .
> For more options, visit this group at
> http://groups.google.com/group/castle-project-users?hl=en.
>
--
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.