在C#中,在运行时将属性更改为只读

时间:2016-08-24 15:57:50

标签: c# .net

我正在创建一个带泛型的属性类。这个泛型将是用户创建的类,它模仿配置文件中的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
            }
        }
    }

1 个答案:

答案 0 :(得分:2)

两件事,一个C#不允许通用属性类。所以这不会奏效。

其次,您无法将属性更改为仅在运行时读取。反射是检查加载类型的元数据,而不是更改元数据。

你可以自己支持这些属性,但这是一个更大的努力。