【发布时间】:2012-10-26 05:43:43
【问题描述】:
我有一个“设置”类,它具有一些可用性和限制设置访问器的属性。当我有十件以内的物品时,这似乎很容易,但后来它们的数量增加了。我需要一些方法来自动创建这些属性,就像这样:
foreach(var property in SettingsList)
{
_settings.AddAutoProperty(property);
}
它可能处理反射,但我无法找到有效的解决方案。
属性定义:
public bool cbNextExcCount
{
get { return (bool)this.GetValueById("cbNextExcCount"); }
}
public bool cbSaveOnChangeExc
{
get { return (bool)this.GetValueById("cbSaveOnChangeExc"); }
}
public bool cbAutoIncrement
{
get { return (bool)this.GetValueById("cbAutoIncrement"); }
}
public bool cbRememberOnExit
{
get { return (bool)this.GetValueById("cbRememberOnExit"); }
}
...etc.
更新 总结一下,我写了下一段代码:
public IDictionary<string, object> Properties = new ExpandoObject();
private List<string> SettingsList = new List<string>
{
"cbNextExcCount",
"cbSaveOnChangeExc",
"cbAutoIncrement",
"cbRememberOnExit"
};
public void CreateProperties()
{
foreach (string SettingName in SettingsList)
{
Properties.Add(SettingName, () => this.GetValueById(SettingName));
}
}
但我在() => this.GetValueById("cbNextExcCount")) 上有一个错误:
参数类型“lambda 表达式”不可分配给参数类型“对象”。
我可以存储Func<bool>,但设置可能有其他类型而不是 bool,如果我使用 Func,调用起来会有点复杂。
【问题讨论】:
-
属性的标准是什么?以“cb”开头?
-
@AmiramKorach 的匈牙利语形式导致所有人鄙视它(与原始形式相反,有些人仍然捍卫)“cb”表示类级别的布尔值,当然这很明显在这里毫无意义。
-
cb是否意味着后面有复选框?如果是的话,你不使用某种数据绑定是什么?你应该描述你想要做什么,而不仅仅是如何。我觉得会有比你的更简单优雅的解决方案。 -
您不能在运行时动态创建属性并在代码中静态使用它们...您是否尝试在设计/编译时生成属性?
-
"cb" 表示复选框,还有其他属性(用于组合框等),所以不能动态创建属性。很遗憾,但我并不真正喜欢数据绑定,所以最好了解更多关于它的信息,也许我会找到解决方案。
标签: c# .net reflection properties