LbI*_*ISS 5 .net c# reflection properties
我有一个"设置"类,它具有一些可用性属性和限制set访问器.我有10个项目似乎很容易,但随后他们的数量增加了.我需要一些方法来自动创建这些属性,类似于:
foreach(var property in SettingsList)
{
_settings.AddAutoProperty(property);
}
Run Code Online (Sandbox Code Playgroud)
它可能涉及反思,但我无法得到有效的解决方案.
属性定义:
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.
Run Code Online (Sandbox Code Playgroud)
更新 总结一下,我写了下一个代码:
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));
}
}
Run Code Online (Sandbox Code Playgroud)
但我有一个错误() => this.GetValueById("cbNextExcCount")):
参数类型'lambda expression'不能赋值给参数类型'object'.
我可以存储Func<bool>,但设置可能有其他类型而不是bool,如果我使用Func,它会让调用变得复杂一些.
您无法创建自动属性,但可以使用ExpandoObject.
我不确定这是否是您正在寻找的,因为使用expandos意味着使用duck typing(即动态编程).
ExpandoObject 样品:
dynamic expando = new ExpandoObject();
expando.PropertyA = "Hello";
expando.PropertyB = "world!";
Run Code Online (Sandbox Code Playgroud)
有关expandos的一个有趣的事情是ExpandoObjectimplements IDictionary<string, object>,这意味着你可以将任何expando转换为这种类型并迭代它添加的属性,这对于存储运行时创建的设置非常有用.
UPDATE
我会更多地考虑一个很好的解决方案,如果SettingList是自己开发的自定义类,也许你可以添加一个名为属性Custom来SettingList添加有设置期间设计时不添加.
更新2
在您的情况下,您可以添加Func<bool>到ExpandoObject运行时设置,而不是存储某些内容的实际值:
IDictionary<string, object> settings = new ExpandoObject();
settings.Add("cbNextExcCount", () => this.GetValueById("cbNextExcCount"));
Run Code Online (Sandbox Code Playgroud)
实际上,我不知道this代码示例中的范围,而是更改this为可能是实例SettingList或任何内容的任何内容.
添加运行时设置后,可以键入settings变量进行dynamic键入以访问如下属性:
dynamic allSettings = (dynamic)settings;
bool cbNextExcCount = allSettings.cbNextExcCount();
Run Code Online (Sandbox Code Playgroud)