我正在做一個屬性類,它需要一個通用的。這個泛型應該是用戶創建的類,它模仿配置文件中的appSettings部分。他們爲每個鍵創建一個屬性,這個屬性讓他們將該鍵映射到該字段。當他們使用他們的類實例化我的類作爲泛型時,我會遍歷他們的類來查找我的屬性,並在發現時使用它們設置的名稱來查找appSetting鍵,然後將該屬性值設置爲該appSetting值,同時將其轉換爲任何他們設置屬性。在C#中更改一個屬性爲只讀在運行時
所以基本上這是一個映射屬性強烈類型的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
}
}
}
這是你可能想使用'Emit'並將其代理出來的地方。你不能在運行時修改元數據...... – code4life
從來沒有聽說過Emit,但它看起來像一個全新的世界。我會深入挖掘。 – user441521
反對的任何理由?我做錯了什麼?很高興知道以供將來參考。 – user441521