Language: C#
Member Class for providing Member.Of()
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:
Report Abuse
Subscribe
Discuss
What's new
What is it
New Snippet
Recent Snippets
My Snippets
Web Code
Search

