You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

63 lines
2.1 KiB
C#

using System;
using System.Collections.Generic;
using System.Reflection;
namespace Otter {
internal class GlideInfo {
private static BindingFlags flags = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static;
public string PropertyName { get; private set; }
public Type PropertyType { get; private set; }
private FieldInfo field;
private PropertyInfo prop;
private object Target;
public object Value {
get {
return field != null ?
field.GetValue(Target) :
prop.GetValue(Target, null);
}
set {
if (field != null) field.SetValue(Target, value);
else prop.SetValue(Target, value, null);
}
}
public GlideInfo(object target, PropertyInfo info) {
Target = target;
prop = info;
PropertyName = info.Name;
PropertyType = prop.PropertyType;
}
public GlideInfo(object target, FieldInfo info) {
Target = target;
field = info;
PropertyName = info.Name;
PropertyType = info.FieldType;
}
public GlideInfo(object target, string property, bool writeRequired = true) {
Target = target;
PropertyName = property;
var targetType = target as Type ?? target.GetType();
if ((field = targetType.GetField(property, flags)) != null) {
PropertyType = field.FieldType;
}
else if ((prop = targetType.GetProperty(property, flags)) != null) {
PropertyType = prop.PropertyType;
}
else {
// Couldn't find either
throw new Exception(string.Format("Field or {0} property '{1}' not found on object of type {2}.",
writeRequired ? "read/write" : "readable",
property, targetType.FullName));
}
}
}
}