﻿<?xml version="1.0" encoding="utf-8"?><rss version="2.0"><channel><title>Ayende @ Rahien</title><link>http://ayende.com</link><description>Ayende @ Rahien</description><copyright>Copyright (C) Ayende Rahien  2004 - 2021 (c) 2026</copyright><ttl>60</ttl><item><title>Daniel Steigerwald commented on Challenge: Dynamically dynamic</title><description>Spam or what? :) www . clipboard.cz/8af
</description><link>http://ayende.com/4547/challenge-dynamically-dynamic#comment16</link><guid>http://ayende.com/4547/challenge-dynamically-dynamic#comment16</guid><pubDate>Tue, 17 Aug 2010 23:27:07 GMT</pubDate></item><item><title>Rene Stein commented on Challenge: Dynamically dynamic</title><description>Constant DUMMY_RESULT has value "undefined" 
  
public const string DUMMY_RESULT = "&lt;undefined&gt;";
</description><link>http://ayende.com/4547/challenge-dynamically-dynamic#comment15</link><guid>http://ayende.com/4547/challenge-dynamically-dynamic#comment15</guid><pubDate>Tue, 17 Aug 2010 21:25:36 GMT</pubDate></item><item><title>Rene Stein commented on Challenge: Dynamically dynamic</title><description>What about this? Dirty, but fully functional draft.
  
  
using System;
  
using System.Collections.Generic;
  
using System.Linq;
  
using System.Text;
  
using System.Dynamic;
  
using Microsoft.CSharp.RuntimeBinder;
  
using System.Linq.Expressions;
  
using System.Runtime.CompilerServices;
  
  
  
  
namespace DynamicCheckPropertyExistence
  
{
  
    class Program
  
    {
  
        static void Main(string[] args)
  
        {
  
            dynamic e = new ExpandoObject();
  
            e.Name = "Ayende";
  
  
            Console.WriteLine(HasProperty("Name", e));
  
            Console.WriteLine(HasProperty("Id", e));
  
            Console.ReadLine();
  
        }
  
  
        private static bool HasProperty(string name, IDynamicMetaObjectProvider dyn)
  
        {
  
  
  
  
            var binder = Binder.GetMember(CSharpBinderFlags.None, name, typeof(Program),
  
                             new[]
  
                                     {
  
                                         CSharpArgumentInfo.Create(
  
                                         CSharpArgumentInfoFlags.None, null)
  
                                     }) as GetMemberBinder;
  
  
  
            var callSite =
  
                        CallSite
&lt;func&lt;callsite,&gt;
&gt;.Create(new SpecialBinderMember(name, false, binder));
  
  
  
            var result = callSite.Target(callSite, dyn);
  
  
            if (Object.ReferenceEquals(result, NoThrowExpressionVisitor.DUMMY_RESULT))
  
            {
  
                return false;
  
            }
  
  
            return true;
  
  
        }
  
    }
  
  
    class SpecialBinderMember : GetMemberBinder
  
    {
  
        private GetMemberBinder m_innerBinder;        
  
        public SpecialBinderMember(string name, bool ignoreCase, GetMemberBinder innerBinder) : base(name, ignoreCase)
  
        {
  
            m_innerBinder = innerBinder;            
  
        }
  
  
        public override DynamicMetaObject FallbackGetMember(DynamicMetaObject target, DynamicMetaObject errorSuggestion)
  
        {
  
  
  
            var retMetaObject = m_innerBinder.Bind(target, new DynamicMetaObject[] {});
  
  
            var resultExpression = new NoThrowExpressionVisitor().Visit(retMetaObject.Expression);
  
  
            var finalMetaObject = new DynamicMetaObject(resultExpression, retMetaObject.Restrictions);
  
            return finalMetaObject;
  
  
        }
  
  
    }
  
  
    class NoThrowExpressionVisitor : ExpressionVisitor
  
    {        
  
        public const string DUMMY_RESULT = "
&lt;undefined";
  
  
        public NoThrowExpressionVisitor()
  
        {
  
  
        }
  
  
        protected override Expression VisitConditional(ConditionalExpression node)
  
        {
  
  
            if (node.IfFalse.NodeType != ExpressionType.Throw)
  
            {
  
                return base.VisitConditional(node);
  
            }
  
  
            Expression
&lt;func&lt;object&gt; dummyFalseResult = () =&gt; DUMMY_RESULT;
  
            var invokeDummyFalseResult = Expression.Invoke(dummyFalseResult, null);                                    
  
            return Expression.Condition(node.Test, node.IfTrue, invokeDummyFalseResult);
  
        }
  
  
    }
  
}
  
  
  
  
  
  
&gt;</description><link>http://ayende.com/4547/challenge-dynamically-dynamic#comment14</link><guid>http://ayende.com/4547/challenge-dynamically-dynamic#comment14</guid><pubDate>Tue, 17 Aug 2010 21:15:22 GMT</pubDate></item><item><title>Frank Quednau commented on Challenge: Dynamically dynamic</title><description>@Justin,
  
I had a couple of issues with your code, I have developed it further into this gist: 
[http://gist.github.com/478382](http://gist.github.com/478382) . Based on reflection it can now also check existence of methods and property setters.
</description><link>http://ayende.com/4547/challenge-dynamically-dynamic#comment13</link><guid>http://ayende.com/4547/challenge-dynamically-dynamic#comment13</guid><pubDate>Fri, 16 Jul 2010 14:02:05 GMT</pubDate></item><item><title>Ayende Rahien commented on Challenge: Dynamically dynamic</title><description>Teleo,
  
That is okay by me, since indexes are rarely changing.
</description><link>http://ayende.com/4547/challenge-dynamically-dynamic#comment12</link><guid>http://ayende.com/4547/challenge-dynamically-dynamic#comment12</guid><pubDate>Wed, 30 Jun 2010 16:01:36 GMT</pubDate></item><item><title>Teleo commented on Challenge: Dynamically dynamic</title><description>@Ayende, 
  
  
By the way, I saw that RavenDB uses CodeDom to compile its indexes. My guess is that you chose this approach due to lack of good alternatives of code generation with 'dynamic' and expando objects.
  
  
What do you think about the fact that with each compilation CodeDom generates assemblies that remain loaded in the app domain?
  
  
Thanks,
  
T
</description><link>http://ayende.com/4547/challenge-dynamically-dynamic#comment11</link><guid>http://ayende.com/4547/challenge-dynamically-dynamic#comment11</guid><pubDate>Wed, 30 Jun 2010 15:29:13 GMT</pubDate></item><item><title>David commented on Challenge: Dynamically dynamic</title><description>I think the point was to avoid putting it in a Try/Catch.  I'm guessing this is for RavenDB, try/catch constructs are expensive.
</description><link>http://ayende.com/4547/challenge-dynamically-dynamic#comment10</link><guid>http://ayende.com/4547/challenge-dynamically-dynamic#comment10</guid><pubDate>Fri, 25 Jun 2010 18:53:39 GMT</pubDate></item><item><title>ElSillo commented on Challenge: Dynamically dynamic</title><description>Sounds so simple to be silly, but waht about TryGetMember ?
</description><link>http://ayende.com/4547/challenge-dynamically-dynamic#comment9</link><guid>http://ayende.com/4547/challenge-dynamically-dynamic#comment9</guid><pubDate>Wed, 23 Jun 2010 23:01:16 GMT</pubDate></item><item><title>Ayende Rahien commented on Challenge: Dynamically dynamic</title><description>It is, but I don't like it
</description><link>http://ayende.com/4547/challenge-dynamically-dynamic#comment8</link><guid>http://ayende.com/4547/challenge-dynamically-dynamic#comment8</guid><pubDate>Wed, 23 Jun 2010 16:08:18 GMT</pubDate></item><item><title>Matt Warren commented on Challenge: Dynamically dynamic</title><description>Is the try/catch method not a workable solution?
</description><link>http://ayende.com/4547/challenge-dynamically-dynamic#comment7</link><guid>http://ayende.com/4547/challenge-dynamically-dynamic#comment7</guid><pubDate>Wed, 23 Jun 2010 15:51:52 GMT</pubDate></item><item><title>Ayende Rahien commented on Challenge: Dynamically dynamic</title><description>Matt,
  
Sort of, I can't figure out a good way to do that.
</description><link>http://ayende.com/4547/challenge-dynamically-dynamic#comment6</link><guid>http://ayende.com/4547/challenge-dynamically-dynamic#comment6</guid><pubDate>Wed, 23 Jun 2010 15:39:53 GMT</pubDate></item><item><title>Matt Warren commented on Challenge: Dynamically dynamic</title><description>I'm guessing this is a "fix" to the patch I just submitted ;-)
</description><link>http://ayende.com/4547/challenge-dynamically-dynamic#comment5</link><guid>http://ayende.com/4547/challenge-dynamically-dynamic#comment5</guid><pubDate>Wed, 23 Jun 2010 15:38:22 GMT</pubDate></item><item><title>Steve commented on Challenge: Dynamically dynamic</title><description>The only problem is that dynamic providers have to fill the GetDynamicMemberNames() themself. So it's possible that the original code will correctly return true while your code will return false.
  
  
The method will just return new string[0] by default, and it's ExpandoObject that just returns all known keys there.
</description><link>http://ayende.com/4547/challenge-dynamically-dynamic#comment4</link><guid>http://ayende.com/4547/challenge-dynamically-dynamic#comment4</guid><pubDate>Wed, 23 Jun 2010 14:50:46 GMT</pubDate></item><item><title>Andrew Davey commented on Challenge: Dynamically dynamic</title><description>This seems to work for me. Not really done much stuff with dynamic however - so it might be silly!
  
  
private static bool HasProperty(string name, IDynamicMetaObjectProvider dyn)
  
{
  
    return dyn.GetMetaObject(Expression.Constant(dyn)).GetDynamicMemberNames().Contains(name);
  
}
</description><link>http://ayende.com/4547/challenge-dynamically-dynamic#comment3</link><guid>http://ayende.com/4547/challenge-dynamically-dynamic#comment3</guid><pubDate>Wed, 23 Jun 2010 14:38:45 GMT</pubDate></item><item><title>Ayende Rahien commented on Challenge: Dynamically dynamic</title><description>Doug,
  
Did you missed the part where I explicitly said that I wanted a solution that would work for things _other_ than expando object?
</description><link>http://ayende.com/4547/challenge-dynamically-dynamic#comment2</link><guid>http://ayende.com/4547/challenge-dynamically-dynamic#comment2</guid><pubDate>Wed, 23 Jun 2010 14:28:47 GMT</pubDate></item><item><title>Doug commented on Challenge: Dynamically dynamic</title><description>    class Program
  
    {
  
        static void Main(string[] args)
  
        {
  
            dynamic e = new ExpandoObject();
  
            e.Name = "John";
  
  
            Console.WriteLine(HasProperty("Name", e));
  
            Console.WriteLine(HasProperty("Test", e));
  
        }
  
  
        private static bool HasProperty(string name, IDynamicMetaObjectProvider dyn)
  
        {
  
            return ((IDictionary
&lt;string,&gt;
)dyn).ContainsKey(name);
  
        }
  
    }
  
</description><link>http://ayende.com/4547/challenge-dynamically-dynamic#comment1</link><guid>http://ayende.com/4547/challenge-dynamically-dynamic#comment1</guid><pubDate>Wed, 23 Jun 2010 14:25:12 GMT</pubDate></item></channel></rss>