In Generic Class, it is quite common to get the value for a specific property dynamically. C# refection provides ways to get the Property value dynamically. If the IDynamicMetaObjectProvider can provide the dynamic member names, you can get them. See GetMemberNames implementation in the apache licensed ImpromptuInterface (which can be found in nuget), it works for ExpandoObjects and DynamicObjects that implement GetDynamicMemberNames and any other IDynamicMetaObjectProvider who provides a meta object with an implementation of GetDynamicMemberNames without custom testing beyond is IDynamicMetaObjectProvider.
You can get the Property Value using the following code snippet:
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| public static object GetPropertyValue(object o, string member) | |
| { | |
| if (o == null) throw new ArgumentNullException("o"); | |
| if (member == null) throw new ArgumentNullException("member"); | |
| Type scope = o.GetType(); | |
| IDynamicMetaObjectProvider provider = o as IDynamicMetaObjectProvider; | |
| if (provider != null) | |
| { | |
| ParameterExpression param = Expression.Parameter(typeof(object)); | |
| DynamicMetaObject mobj = provider.GetMetaObject(param); | |
| GetMemberBinder binder = (GetMemberBinder)Microsoft.CSharp.RuntimeBinder.Binder.GetMember(0, member, scope, new[] { CSharpArgumentInfo.Create(0, null) }); | |
| DynamicMetaObject ret = mobj.BindGetMember(binder); | |
| BlockExpression final = Expression.Block( | |
| Expression.Label(CallSiteBinder.UpdateLabel), | |
| ret.Expression | |
| ); | |
| LambdaExpression lambda = Expression.Lambda(final, param); | |
| Delegate del = lambda.Compile(); | |
| return del.DynamicInvoke(o); | |
| } | |
| return o.GetType().GetProperty(member, BindingFlags.Public | BindingFlags.Instance).GetValue(o, null); | |
| } |

Leave a comment