using System.Reflection; using ln.type; namespace ln.application { public class FieldArgument : IArgument { public FieldInfo FieldInfo { get; } public object Instance { get;} public FieldArgument(FieldInfo fieldInfo) :this(null, fieldInfo, fieldInfo.GetCustomAttribute()) {} public FieldArgument(object instance,FieldInfo fieldInfo) :this(instance, fieldInfo, fieldInfo.GetCustomAttribute()) {} public FieldArgument(FieldInfo fieldInfo, StaticArgumentAttribute staticArgumentAttribute) :this(null,fieldInfo,staticArgumentAttribute){} public FieldArgument(object instance,FieldInfo fieldInfo, StaticArgumentAttribute staticArgumentAttribute) { FieldInfo = fieldInfo; OptionName = staticArgumentAttribute?.Option ?? (char)0; LongOptionName = staticArgumentAttribute?.LongOption ?? fieldInfo.Name; HelpString = staticArgumentAttribute?.HelpString ?? ""; HasArgument = fieldInfo.FieldType != typeof(bool); Instance = instance; } public char OptionName { get; } public string LongOptionName { get; } public bool HasArgument { get; } public string HelpString { get; } public string Value { get => FieldInfo.GetValue(Instance)?.ToString(); set { if (HasArgument) { FieldInfo.SetValue(Instance, Cast.To(value, FieldInfo.FieldType)); } else { FieldInfo.SetValue(Instance, true); } } } } }