我正在创建一个带泛型的属性类。这个泛型将是用户创建的类,它模仿配置文件中的appSettings部分。它们为每个键创建一个属性,该属性允许它将该键映射到该字段。当他们使用他们的类作为泛型实例化我的类时,我会通过他们的类查找我的属性,当找到它时,我使用他们设置的名称来查找appSetting键,然后将该属性值设置为该appSetting值,同时将其转换为任何值键入他们设置他们的属性。
所以基本上这是一个映射属性,它强烈地键入配置文件中的appSettings。它使得映射在类中完成,而不是用户必须在代码中内联并使其混乱。漂亮而干净的地图。
我的最后一步是我想将它们的属性标记为只读,但我无法弄清楚如何做到这一点,因为PropertyInfo类的CanWrite属性本身是只读的。
/// <summary>
/// This class will fill in the fields of the type passed in from the config file because it's looking for annotations on the type
/// </summary>
public class StrongConfiguration<T> where T: class
{
// this is read only
public T AppSettings { get; private set; }
public StrongConfiguration()
{
AppSettings = (T)Activator.CreateInstance(typeof(T));
// find properties in this type that have the ConfigAttribute attribute on them
var props = from p in AppSettings.GetType().GetProperties()
let attr = p.GetCustomAttributes(typeof(ConfigAttribute), true)
where attr.Length == 1
select new { Property = p, Attribute = attr.First() as ConfigAttribute };
// find the config setting from the ConfigAttribute value on each property and set it's value casting to the propeties type
foreach (var p in props)
{
var appSettingName = ConfigurationManager.AppSettings[p.Attribute.ConfigName];
var value = Convert.ChangeType(appSettingName, p.Property.PropertyType);
p.Property.SetValue(AppSettings, value);
// todo: I want to set this propety now as read-only so they can't change it but not sure how
}
}
}
答案 0 :(得分:2)
两件事,一个C#不允许通用属性类。所以这不会奏效。
其次,您无法将属性更改为仅在运行时读取。反射是检查加载类型的元数据,而不是更改元数据。
你可以自己支持这些属性,但这是一个更大的努力。