Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- public static partial class TypeExtensions
- {
- public static MemberExpression GetNestedFieldExpression(this Type me, string address, Expression parent = null)
- {
- var myExpression = parent ?? Expression.Constant(Activator.CreateInstance(me));
- if (address.Contains('.'))
- {
- var nestedAddress = address.Split(new char[] { '.' }, 2);
- var nestedProp = me.GetProperty(nestedAddress[0]);
- if (nestedProp == null) return null;
- // if we're trying to express through IEnums then we need
- // to call FirstOrDefault() so that it can access the type
- // contained within itself
- Type nestedType = nestedProp.PropertyType;
- Expression nestedExpression = Expression.Property(myExpression, nestedAddress[0]);
- if (
- nestedType.IsGenericType &&
- (
- nestedType.GetGenericTypeDefinition() == typeof(IEnumerable<>) ||
- nestedType.GetGenericTypeDefinition() == typeof(List<>)
- )
- )
- {
- nestedType = nestedType.GetGenericArguments()[0];
- nestedExpression = Expression.Call(typeof(Enumerable), "FirstOrDefault", new Type[] { nestedType }, nestedExpression);
- }
- return nestedType.GetNestedFieldExpression(
- nestedAddress[1],
- nestedExpression
- );
- }
- else
- {
- var nestedProp = me.GetProperty(address);
- if (nestedProp == null) return null;
- return Expression.Property(myExpression, address);
- }
- }
- }
Add Comment
Please, Sign In to add comment