gpt4 book ai didi

C#如何获取正在设置的属性的名称

转载 作者:太空狗 更新时间:2023-10-29 21:13:03 24 4
gpt4 key购买 nike

我有一个数据库对象类可以完成大量繁重的工作。然后我扩展该对象并构建代表实际对象和正在修改的字段的类。它基本上看起来像这样:

public class MyObject : DatabaseObject
{
public string FieldX
{
get { return GetValue<string>("FieldX"); }
set { SetValue<string>("FieldX", value); }
}

public int FieldY
{
get { return GetValue<int>("FieldY"); }
set { SetValue<int>("FieldY", value); }
}
}

public class DatabaseObject
{
public T GetValue<T>(string FieldName)
{
// Code that actually gets the right value
}

public void SetValue<T>(string FieldName, T value)
{
// Code that actually sets the value in the right place
}
}

这样,我稍后可以实例化 MyObject 并开始通过代码设置属性。我们的想法是生成更简单、更易于维护的代码。

它在实践中效果很好。但是,我注意到 MyObject 的代码非常重复。例如,对于 FieldX,我最终在 get/set 中指定了“string”类型,并且还必须在 get/set 中指定属性名称“FieldX”。

我想知道是否有一种方法可以进一步简化代码以减少重复。

我知道我可以使用反射:

MethodBase.GetCurrentMethod().Name.Substring(4)

...在 get/set 调用中获取属性名称,我可以在设置时使用 GetType() 获取值的类型,但理想情况下我想从中获取原始属性名称基本的 GetValue/SetValue 方法(最好不解析堆栈跟踪)。

理想情况下,我正在寻找这样的东西:

    public string FieldX
{
get { return GetValue(); }
set { SetValue(value); }
}

public int FieldY
{
get { return GetValue(); }
set { SetValue(value); }
}

有什么想法吗?

最佳答案

C# 5.0 通过使用 [CallerMemberName] 支持这一点默认参数上的属性。像这样:

public static object GetValue([CallerMemberName] string caller = "")
{
Trace.WriteLine("Called by: " + caller);
return null;
}

并且会像这样使用:

public string FieldX
{
get { return (string)GetValue(); }
}

这由编译器自动提供 GetValue 的参数来实现。基于来电者的姓名。

您可以了解有关此功能的更多信息 in MSDN .

你或许可以制作GetValue通用所以它可以像GetValue<string>()一样使用在您的属性中。

关于C#如何获取正在设置的属性的名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20507703/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com