Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- static class Program
- {
- static void Main(string[] args)
- {
- var a = new C1();
- Ext.SetValue(() => a.Msg, "TEST");
- Debug.Assert(a.Msg == "TEST");
- }
- }
- class C1
- {
- public string Msg { get; set; }
- }
- static class Ext
- {
- public static void SetValue<T>(Expression<Func<T>> expr, T value)
- {
- object obj;
- MemberInfo mInfo = expr.GetMemberInfo<T>(out obj);
- FieldInfo fInfo = mInfo as FieldInfo;
- PropertyInfo pInfo = mInfo as PropertyInfo;
- if (fInfo != null)
- fInfo.SetValue(obj, value);
- else if (pInfo != null && pInfo.CanWrite)
- pInfo.SetValue(obj, value, null);
- }
- public static MemberInfo GetMemberInfo<T>(this Expression<Func<T>> expr, out object obj)
- {
- if (expr == null)
- throw new ArgumentNullException("expr");
- var body = expr.Body as MemberExpression;
- if (body == null)
- {
- var unaryExpr = expr.Body as UnaryExpression;
- if (unaryExpr == null)
- throw new ArgumentException("'expr' should be either an unary expression or a member expression");
- body = unaryExpr.Operand as MemberExpression;
- }
- if (body == null)
- throw new ArgumentException("'expr' should be a member expression");
- LambdaExpression lambdaExpr = Expression.Lambda(body.Expression);
- Delegate lambdaFunc = lambdaExpr.Compile();
- obj = lambdaFunc.DynamicInvoke();
- MemberInfo mInfo = obj.GetType().GetMember(body.Member.Name).FirstOrDefault();
- if (mInfo == null)
- throw new InvalidOperationException("Member not found.");
- return mInfo;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement