public static FastGetter <TClass, TResult> CreateGetter <TClass, TResult>(string name) { var fieldInfo = AccessTools.Field(typeof(TClass), name); var propInfo = AccessTools.Property(typeof(TClass), name); if (fieldInfo == null && propInfo == null) { throw new Exception($"{typeof(TClass).Name} does not contain field or property {name}"); } bool isProp = propInfo != null; Type memberType = isProp ? propInfo.PropertyType : fieldInfo.FieldType; string memberTypeName = isProp ? "property" : "field"; if (!typeof(TResult).IsAssignableFrom(memberType)) { throw new InvalidCastException($"Cannot cast field type {typeof(TResult).Name} as {memberType} for class {typeof(TClass).Name} {memberTypeName} {name}"); } var handler = isProp ? FastAccess.CreateGetterHandler <TClass, TResult>(propInfo) : FastAccess.CreateGetterHandler <TClass, TResult>(fieldInfo); return(new FastGetter <TClass, TResult>(handler)); }
public static FastGetter CreateGetterProperty(this Type type, string name) { return(new FastGetter(FastAccess.CreateGetterHandler(AccessTools.Property(type, name)))); }