using System; namespace RosettaUI { /// /// 型とフィールドかプロパティ名から生成されるGetter /// public static class PropertyOrFieldGetter { public static IGetter Create(IGetter getter, string propertyOrFieldName) { if (getter == null) return null; var parentType = getter.ValueType; var memberType = TypeUtility.GetPropertyOrFieldType(parentType, propertyOrFieldName); var getterType = typeof(PropertyOrFieldGetter<,>).MakeGenericType(parentType, memberType); return Activator.CreateInstance(getterType, getter, propertyOrFieldName) as IGetter; } } public class PropertyOrFieldGetter : ChildGetter { private readonly Func _getFunc; public PropertyOrFieldGetter(IGetter parentGetter, string propertyOrFieldName) : base(parentGetter) { (_getFunc, _) = PropertyOrFieldGetterSetter.GetGetterSetter(propertyOrFieldName); } protected override TValue GetFromChild(TParent parent) { return _getFunc(parent); } } }