5

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

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,调用起来会更复杂一些。

4

2 回答 2

8

您无法创建自动属性,但可以使用ExpandoObject.

我不确定这是否是您正在寻找的,因为使用 expandos 意味着使用鸭子类型(即动态编程)。

ExpandoObject样本:

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

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

更新

我在考虑一个好的解决方案,如果SettingList是你自己开发的自定义类,也许你可以添加一个名为Customto的属性SettingList并添加在设计时未添加的设置。

更新 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();
于 2012-11-06T09:42:23.627 回答
1

您可以考虑 System.Dynamic 命名空间中的 Expando 对象。这篇文章可以是一个好的开始。

于 2012-11-06T09:43:09.797 回答