从反射或硬编码字符串中将方法名称提取为字符串?

2024-06-10

我正在从属性调用一个方法。我必须将属性名称作为该方法的属性传递。我的财产是

string lcl_name = string.Empty;

public string Name 
{
get { return lcl_name; }
set 
    {
        if (lcl_name != value) 
        {
            lcl_name = value;
            Foo_Method(GetCorrectPropertyName(MethodBase.GetCurrentMethod().Name));
        }
}
}

方法是

public string GetCorrectPropertyName(string propertyName)
{
    return propertyName.StartsWith("set_") || propertyName.StartsWith("get_") ? 
           propertyName.Substring(4) : string.Empty;
}

我的前辈说我不应该调用 Reflection 并以这种方式直接将字符串传递给方法

Foo_Method("Name");

但在这种情况下,由于它将被硬编码,并且如果属性名称发生更改,则方法调用必须相应更改。

那么我的问题是,就效率而言,哪一个更好?我的前辈们是否还看到了其他我没有注意到的事情?


Maybe 表达式树 http://msdn.microsoft.com/en-us/library/bb397951.aspx可以在这里帮助你。

代替Foo_Method将属性名称作为字符串

void Foo_Method(string name)
{

}

使用类型参数Expression通过检索属性名称会员表达 http://msdn.microsoft.com/en-us/library/system.linq.expressions.memberexpression.aspx:

void Foo_Method(Expression<Func<NameOfYourClass, String>> exp)
{
    var propertyName = ((MemberExpression)exp.Body).Member.Name;
}

并这样称呼它

public string Name 
{
    get { return lcl_name; }
    set 
    {
        if (lcl_name != value) 
        {
            lcl_name = value;
            // Foo_Method("Foo"); string is bad
            Foo_Method(x => x.Name);
        }
    }   
}

这样,重命名时Name,你不会破坏你的代码,因为Foo_Method(x => x.Name)也会被重命名(当然,当使用 IDE 重构功能进行重命名时)。


Edit:

回答您的评论:

如果您确实无法向 Foo_Method 添加重载,您当然可以创建另一个方法:

if (lcl_name != value) 
{
    lcl_name = value;
    Foo_Method(GetPropName(x => x.Name));
}

...

string GetPropName(Expression<Func<NameOfYourClass, String>> exp)
{
    return ((MemberExpression)exp.Body).Member.Name;
}

Edit2:

回答您的其他评论:

您可以创建一个扩展方法

public static class Extensions
{
    public static string GetPropName<T>(this T t, Expression<Func<T, String>> exp)
    {
        return ((MemberExpression)exp.Body).Member.Name;
    }
}

var propertyName = yourInstace.GetPropName(y => y.Name);

但您不必这样做,因为表达式无需任何实例即可正常工作。

public static class Extensions
{
    public static string GetPropName<T>(Expression<Func<T, String>> exp)
    {
        return ((MemberExpression)exp.Body).Member.Name;
    }
}

var propertyName  = Extensions.GetPropName<YourClass>(y => y.Name);

诀窍是在这里使用泛型。


第一种方法在 VB.Net 中看起来像这样

Public Function GetPropName(Of TClass, TProperty)(exp As Expression(Of Func(Of TClass, TProperty))) as String
    Return DirectCast(exp.Body, MemberExpression).Member.Name
End Function

...

GetPropName(Function(x) x.Name)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从反射或硬编码字符串中将方法名称提取为字符串? 的相关文章

随机推荐

  • TFS 和引用的 DLL

    我们使用的是 TFS 和 VS 2010 我一直在从事一个使用 TFS 作为源代码控制的项目 我已经下载了相当多的 dll 例如 log4net 并在我的项目中引用 当一个新程序员连接到 TFS 并使我的项目脱离源代码控制时 它无法构建 因
  • PreviewCallback 的 android 相机释放错误

    所以我阅读了 Camera API 但找不到任何相关内容 我正在使用相机抓取帧 它工作得很好 直到我尝试释放相机 我在一系列调用中复制了该错误 camera Camera open camera setPreviewDisplay getH
  • 如何修改CToolTipCtrl的工具矩形?

    这个问题是与此相关的 https stackoverflow com questions 269837 how do i display custom tooltips in a ctreectrl 在 CDockablePane 派生类中
  • 如何更改 Visual Studio 2017 中的查找结果格式?

    在 Visual Studio 的早期版本中 您可以通过更改 Find 的值来更改显示结果的方式HKEY CURRENT USER Software Microsoft VisualStudio VSVersion Find Find re
  • UIView 的 initWithFrame 不起作用?

    我通过 Interfacebuilder 将视图控制器设置为特定视图 但 initWithFrame 没有调用 但 drawRect 正在被调用 当我放置断点时 是的 因为不能保证initWithFrame 将在取消归档 xib 时调用 尝
  • AngularJS:指令中的 element.show() 不起作用

    我有一个指令 参见 plunk http plnkr co edit GiityBz2oOrWxP8gjTgZ p preview 用样式包装 DIVdisplay none一秒钟后显示其内容 我尝试用 element show 和 ele
  • 意外推送提交:更改 git 提交消息

    在我的本地存储库中 我有一次提交的提交消息不正确 我已经发布了错误的提交消息git push 现在 远程存储库 由 GitHub 托管 也有错误的提交消息 我已经尝试过了git commit amend 但发现在这种情况下它对我不起作用 因
  • 文档字符串是否应该只包含函数显式引发的异常?

    当用 python 编写文档字符串时 我想知道文档字符串是否应该包含隐式引发的异常 或者是否还应该包含我显式引发的异常 考虑功能 def inv a if a 0 raise ZeroDivisionError else return 1
  • Swift Mirror 反射不返回 UIVIew 上的属性

    尝试使用以下内容获取 UIView 或 UIViewController 的所有属性 func propertysNames gt String var s String for c in Mirror reflecting self ch
  • 有没有办法在 C++ 中循环对象的不同数据成员

    如果我有一个由 3 个双精度数组成的类对象 x y 和 z 有没有办法在函数中循环它们 e g for i in x y z do something 我可以通过显式转换做类似的事情 但我想知道是否有更优雅的解决方案 class testc
  • Docker:使用 RUN 命令设置 ENV 变量的值?

    我正在编写一个 Dockerfile 来设置我的自定义 WordPress 环境 我从 ubuntu latest 开始 希望通过将 ENV 变量设置为当前 Ubuntu 版本的代号来动态添加一些存储库 我该如何做到这一点 或者有更好的方法
  • MS JSON 日期序列化和夏令时

    我们有一个托管在 ASP NET 应用程序中的 Ajax Web 服务 该服务接受 DateTime 参数 出于本问题的目的 该参数应接收与以下内容等效的 DateTime Date 1359727200000 0200 这是 2013 年
  • 如何使用python远程执行进程

    我想使用 Python 连接到远程服务器并在远程服务器上执行进程 我希望能够获取进程的返回代码和标准错误 如果有 以前有没有人做过类似的事情 我已经用 ssh 完成了 但我想从 Python 脚本中完成 Cheers Use the 名为
  • 如何使用 YouTube API 获取视频字幕

    是否可以从 YouTube API 检索 获取 YouTube 视频 不属于用户所有 的字幕 在 v2 中 您只能访问视频字幕 在 v3 中 尚不支持字幕 但很快就会支持 这是服务条款问题 而不是提供这些标题
  • ConnectionTimeout 与 SocketTimeout

    我正在使用的库有问题 可能是图书馆的问题 也可能是我用错了 基本上 当我这样做时 超时以毫秒为单位 ignitedHttp setConnectionTimeout 1 v short ignitedHttp setSocketTimeou
  • 猫鼬模式创建

    我刚刚开始使用猫鼬 我有一个使用 mongoose 的创建脚本 它使用示例数据创建模式和数据库 现在我编写实际的应用程序 我是否需要在每次应用程序运行时创建架构对象 或者它是否已经以某种方式可用 换句话说 我是否需要在每个使用 mongoo
  • 将参数传递给 OWIN 主机

    我使用 OWIN 自托管 ASP NET Web API 和 SignalR 我使用以下代码启动服务器 在控制台应用程序上 using WebApplication Start
  • 使用 Docker-Compose 运行 Google Firestore 模拟器

    我正在尝试运行我的 Node 项目以及 Firestore 模拟器docker compose在本地开发环境中 我的 Node 项目有一个 Dockerfile 如下所示 WORKDIR app ADD package json RUN n
  • 如何在java script/jsp中查找客户端计算机名称?

    我的打印应用程序必须获取客户名称 然后打印文档 如何在java脚本或jsp中找到它 我在这里搜索过 有些人正在讨论 PHP 等等 关于运行安全小程序来获取客户端计算机名称的讨论 如果是这样 请给我一个例子来做到这一点 谢谢大家 你不能用 J
  • 从反射或硬编码字符串中将方法名称提取为字符串?

    我正在从属性调用一个方法 我必须将属性名称作为该方法的属性传递 我的财产是 string lcl name string Empty public string Name get return lcl name set if lcl nam