c# - 如何自动创建属性?

标签 c# .net reflection properties

我有一个“设置”类,它有一些可用性和限制设置访问器的属性。当我有十件以内的元素时,这似乎很容易,但后来它们的数量增加了。我需要一些方法来自动创建这些属性,例如:

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,调用起来会有点复杂。

最佳答案

您不能创建自动属性,但可以使用 ExpandoObject .

我不确定这是否是您要查找的内容,因为使用 expandos 意味着使用duck typing(即动态编程)。

ExpandoObject示例:

dynamic expando = new ExpandoObject();
expando.PropertyA = "Hello";
expando.PropertyB = "world!";

expandos 的一个有趣之处在于 ExpandoObject工具 IDictionary<string, object> ,这意味着您可以将任何 expando 向上转换为这种类型并迭代其添加的属性,这对于存储运行时创建的设置非常有用。

更新

我正在考虑更多的好的解决方案,如果 SettingList是自己开发的自定义类,或许可以加一个属性叫CustomSettingList并添加在设计时未添加的设置。

更新 2

在您的情况下,您可以添加 Func<bool> 而不是存储某物的实际值至 ExpandoObject的运行时设置:

IDictionary<string, object> settings = new ExpandoObject();
settings.Add("cbNextExcCount", () => this.GetValueById("cbNextExcCount"));

其实我也不知道this代码示例中的范围,但更改 this任何可能是 SettingList 实例的东西或其他。

添加运行时设置后,您可以键入 settings变量为 dynamic键入以访问如下属性:

dynamic allSettings = (dynamic)settings;
bool cbNextExcCount = allSettings.cbNextExcCount();

关于c# - 如何自动创建属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13248199/

相关文章:

c# - 是否有正确的方法来检查计算机上是否安装了特定的 Microsoft 应用程序?

c# - LINQ 加入 2 个数据表并使用 SUM AND GROUP BY

c# - .NET 中程序集的概念是什么?

java - 有没有更好(更安全)的方法来获取参数化类型的类?

java - 如何迭代 invoke() 调用的返回结果?

c# - 如何从 Action 委托(delegate)创建 MethodInfo

c# - 在 C# 中将一种任意类型转换为另一种类型的通用方法

c# - 在 C 中查找事件用户目录的路径

c# - NAudio 将样本缓冲区转换为波形缓冲区

c# - 如何显示消息框并保持应用程序执行