【发布时间】:2012-04-18 14:24:24
【问题描述】:
想象以下类:
public class Settings
{
[FileBackedProperty("foo.txt")]
public string Foo { get; set; }
}
我希望能够编写与上述类似的内容,并让settings.Foo 从文件“foo.txt”中读取,settings.Foo = "bar" 写入“foo.txt”。
显然这是一个简化的示例,我不会在生产应用程序中执行上述操作,但还有其他示例,例如我希望将 Foo 存储在 ASP.net 会话状态“foo”中但我厌倦了一遍又一遍地编写以下代码:
public int Foo
{
get
{
if (Session["foo"] != null)
return Convert.ToInt32(Session["foo"]);
else
// Throw an exception or return a default value
}
set
{
Session["foo"] = value;
}
}
(再次简化这个例子,我不会写上面的代码,实际上我在撒谎,我有上面的代码并且正在努力重构它,因此这个问题)
上面的例子很好,除非你有 50 个不同的会话值,它们都有相似的逻辑。那么有没有办法可以将第二个属性转换为类似于第一个属性的东西? (使用属性和反射,或者其他方法?)
【问题讨论】:
-
如果你使用 Visual Studio,你应该看看code snippets。它们允许您键入简短的内容,扩展为所需的代码,然后允许您填写指定的区域。类似于现有的propg等
-
@JoshuaDrake 这似乎和复制/粘贴一样糟糕。如果我想更改实现怎么办?我仍然需要返回并单独更改每个属性。
-
所以你想在运行时动态添加属性?您是否拥有所有服务器机器,或者对性能的期望很低?并不是说你不能这样做,但我强烈警告不要这样做。如果您的意思不是在运行时,那么无论如何您都必须重新生成任何代码输出。
标签: c# reflection metaprogramming