New Snippet New Snippet Recent Snippets Recent Snippets My Snippets My Snippets Web Code Search Snippets Search
Sign inor Register
Language: C#

Member Class for providing Member.Of()

435 Views
Copy Code Show/Hide Line Numbers
   1:  /// <summary>
   2:  /// Class for easily getting information about a type member,
   3:  /// and referencing the member by name, or getting it as a
   4:  /// <see cref="MemberInfo"/>, <see cref="PropertyInfo"/>,
   5:  /// <see cref="FieldInfo"/>, or <see cref="MethodInfo"/>.
   6:  /// </summary>
   7:  public class Member
   8:  {
   9:      /// <summary>
  10:      /// The <see cref="MemberInfo"/> discovered for the member specified.
  11:      /// </summary>
  12:      public MemberInfo Info { get; private set; }
  13:   
  14:      /// <summary>
  15:      /// Initializes a new <see cref="Member"/> using the specified
  16:      /// <see cref="MemberExpression"/>.
  17:      /// </summary>
  18:      /// <param name="expression">The expression that references the desired member.</param>
  19:      public Member(MemberExpression expression)
  20:      {
  21:          this.Info = expression.Member;
  22:      }
  23:   
  24:      /// <summary>
  25:      /// Initializes a new <see cref="Member"/> using the specified
  26:      /// <see cref="MemberInfo"/>.
  27:      /// </summary>
  28:      /// <param name="info">The member info that references the desired member.</param>
  29:      public Member(MemberInfo info)
  30:      {
  31:          this.Info = info;
  32:      }
  33:   
  34:      /// <summary>
  35:      /// Gets the current member as a <see cref="PropertyInfo"/> instance.
  36:      /// </summary>
  37:      /// <returns>A <see cref="PropertyInfo"/> instance for the current member <see cref="Info"/>.</returns>
  38:      /// <exception cref="InvalidCastException">
  39:      /// When the current member cannot be cast to a <see cref="PropertyInfo"/>.
  40:      /// </exception>
  41:      public PropertyInfo AsProperty()
  42:      {
  43:          return (PropertyInfo)this.Info;
  44:      }
  45:   
  46:      /// <summary>
  47:      /// Gets the current member as a <see cref="FieldInfo"/> instance.
  48:      /// </summary>
  49:      /// <returns>A <see cref="FieldInfo"/> instance for the current member <see cref="Info"/>.</returns>
  50:      /// <exception cref="InvalidCastException">
  51:      /// When the current member cannot be cast to a <see cref="FieldInfo"/>.
  52:      /// </exception>
  53:      public FieldInfo AsField()
  54:      {
  55:          return (FieldInfo)this.Info;
  56:      }
  57:   
  58:      /// <summary>
  59:      /// Gets the current member as a <see cref="MethodInfo"/> instance.
  60:      /// </summary>
  61:      /// <returns>A <see cref="MethodInfo"/> instance for the current member <see cref="Info"/>.</returns>
  62:      /// <exception cref="InvalidCastException">
  63:      /// When the current member cannot be cast to a <see cref="MethodInfo"/>.
  64:      /// </exception>
  65:      public MethodInfo AsMethod()
  66:      {
  67:          return (MethodInfo)this.Info;
  68:      }
  69:   
  70:      /// <summary>
  71:      /// Returns the current member name as the string representation of a <see cref="Member"/>.
  72:      /// </summary>
  73:      /// <returns>The name of the current member <see cref="Info"/>.</returns>
  74:      public override string ToString()
  75:      {
  76:          return Info.Name;
  77:      }
  78:   
  79:      /// <summary>
  80:      /// Implicitly cast a <see cref="Member"/> to a <see cref="String"/>, using the
  81:      /// <see cref="ToString"/> method.
  82:      /// </summary>
  83:      /// <param name="member">The <see cref="Member"/> to cast to a string.</param>
  84:      /// <returns>The name of the current member <see cref="Info"/>.</returns>
  85:      public static implicit operator string(Member member)
  86:      {
  87:          return member.ToString();
  88:      }
  89:   
  90:      /// <summary>
  91:      /// Implicitly cast a <see cref="Member"/> to a <see cref="MemberInfo"/>, by
  92:      /// returning the <see cref="Info"/> property value.
  93:      /// </summary>
  94:      /// <param name="member">The <see cref="Member"/> to cast to a <see cref="MemberInfo"/>.</param>
  95:      /// <returns>The <see cref="Info"/> of the specified member, or <c>null</c>.</returns>
  96:      public static implicit operator MemberInfo(Member member)
  97:      {
  98:          return member != null ? member.Info : null;
  99:      }
 100:   
 101:      /// <summary>
 102:      /// Implicitly cast a <see cref="Member"/> to a <see cref="MethodInfo"/>, by
 103:      /// returning the <see cref="AsMethod"/> result.
 104:      /// </summary>
 105:      /// <param name="member">
 106:      /// The <see cref="Member"/> to cast to a <see cref="MethodInfo"/>.
 107:      /// </param>
 108:      /// <returns>A <see cref="MethodInfo"/> for the specified member.</returns>
 109:      /// <exception cref="InvalidCastException">
 110:      /// When the current member cannot be cast to a <see cref="MethodInfo"/>.
 111:      /// </exception>
 112:      public static implicit operator MethodInfo(Member member)
 113:      {
 114:          return member != null ? member.AsMethod() : null;
 115:      }
 116:   
 117:      /// <summary>
 118:      /// Implicitly cast a <see cref="MemberInfo"/> to a <see cref="Member"/>.
 119:      /// </summary>
 120:      /// <param name="memberInfo">The member info to use as a member.</param>
 121:      /// <returns>
 122:      /// A <see cref="MemberInfo"/> representing the specified <paramref name="memberInfo"/>.
 123:      /// </returns>
 124:      public static implicit operator Member(MemberInfo memberInfo)
 125:      {
 126:          return new Member(memberInfo);
 127:      }
 128:   
 129:      /// <summary>
 130:      /// Create a <see cref="Member"/> using a method call expression.
 131:      /// </summary>
 132:      /// <remarks>
 133:      /// This is used for <c>void</c> methods.
 134:      /// </remarks>
 135:      /// <param name="methodCall">The method call expression to use as a member.</param>
 136:      /// <returns>A <see cref="Member"/> for the specified method call expression.</returns>
 137:      public static Member Of(Expression<Action> methodCall)
 138:      {
 139:          return methodCall.AsMethod();
 140:      }
 141:   
 142:      /// <summary>
 143:      /// Create a <see cref="Member"/> using a method call expression
 144:      /// for the specified type.
 145:      /// </summary>
 146:      /// <typeparam name="T"></typeparam>
 147:      /// <param name="methodCall"></param>
 148:      /// <returns></returns>
 149:      public static Member Of<T>(Expression<Action<T>> methodCall)
 150:      {
 151:          return methodCall.AsMethod();
 152:      }
 153:   
 154:      /// <summary>
 155:      /// Create a <see cref="Member"/> using a property, field, or non-void
 156:      /// method call expression.
 157:      /// </summary>
 158:      /// <param name="member">The member expression to use as a member.</param>
 159:      /// <returns>A <see cref="Member"/> for the specified member expression.</returns>
 160:      public static Member Of(Expression<Func<object>> member)
 161:      {
 162:          return member.AsMemberOrMethod();
 163:      }
 164:   
 165:      /// <summary>
 166:      /// Create a <see cref="Member"/> using a property, field, or non-void
 167:      /// method call expression for the specified type.
 168:      /// </summary>
 169:      /// <typeparam name="T">The type containing the member specified.</typeparam>
 170:      /// <param name="member">The member expression to use as a member.</param>
 171:      /// <returns>A <see cref="Member"/> for the specified member expression.</returns>
 172:      public static Member Of<T>(Expression<Func<T, object>> member)
 173:      {
 174:          return member.AsMemberOrMethod();
 175:      }
 176:  }
 177:   
 178:  /// <summary>
 179:  /// Helper class for converting expressions to members.
 180:  /// </summary>
 181:  public static class ExpressionMember
 182:  {
 183:      public static Member AsMethod(this LambdaExpression member)
 184:      {
 185:          if (member == null)
 186:          {
 187:              return null;
 188:          }
 189:   
 190:          MethodCallExpression methodExpr = member.Body as MethodCallExpression;
 191:          return methodExpr != null ? new Member(methodExpr.Method) : null;
 192:      }
 193:   
 194:      public static Member AsMember(this LambdaExpression member)
 195:      {
 196:          if (member == null)
 197:          {
 198:              return null;
 199:          }
 200:   
 201:          MemberExpression memberExpr = member.Body as MemberExpression;
 202:          return memberExpr != null ? new Member(memberExpr) : null;
 203:      }
 204:   
 205:      public static Member AsMemberOrMethod(this LambdaExpression member)
 206:      {
 207:          return member.AsMember() ?? member.AsMethod() ?? member.AsUnaryWrappedMember();
 208:      }
 209:   
 210:      public static Member AsMemberOrMethod(this Expression member)
 211:      {
 212:          MemberExpression memberExpr = member as MemberExpression;
 213:          if (memberExpr != null)
 214:          {
 215:              return memberExpr.Member;
 216:          }
 217:   
 218:          MethodCallExpression methodExpr = member as MethodCallExpression;
 219:          if (methodExpr != null)
 220:          {
 221:              return methodExpr.Method;
 222:          }
 223:   
 224:          UnaryExpression unaryExpr = member as UnaryExpression;
 225:          if (unaryExpr != null)
 226:          {
 227:              return unaryExpr.Operand.AsMemberOrMethod();
 228:          }
 229:   
 230:          return null;
 231:      }
 232:   
 233:      public static Member AsUnaryWrappedMember(this LambdaExpression member)
 234:      {
 235:          if (member == null)
 236:          {
 237:              return null;
 238:          }
 239:   
 240:          UnaryExpression unaryExpr = member.Body as UnaryExpression;
 241:          if (unaryExpr != null)
 242:          {
 243:              return unaryExpr.Operand.AsMemberOrMethod();
 244:          }
 245:   
 246:          return null;
 247:      }
 248:  }
 249:   
by Jeff Handley
  April 10, 2010 @ 3:21am

Add a comment


Report Abuse
brought to you by:
West Wind Techologies


If you find this site useful and use it frequently please consider making a donation to support this free service.
Donate