使用 C# 的类型(反射)是不好的做法吗? [关闭]

Posted

技术标签:

【中文标题】使用 C# 的类型(反射)是不好的做法吗? [关闭]【英文标题】:Is using C#'s Type (Reflection) bad practice? [closed] 【发布时间】:2020-03-25 13:46:12 【问题描述】:

edit 嗯,我不认为这是其他关于 var 的问题的重复。我在问反射,只是好奇它是否应该像 var 一样谨慎使用

还要特别感谢 Flydog57 在 cmets 中的反应,我很感激他们~ edit

如果我的问题不恰当,请原谅我,第一次发布我自己的问题。我正在努力使我的代码更正确,同时也试图让我以前从未尝试过的东西工作〜 玩弄代码,看看我能做什么,不能做什么。即使它没有真正的意义或目的。只是用它来娱乐自己和边走边学。

我当前的项目是让一个脚本将更多行代码添加到另一个文件中。当我意识到代码只是文本时,我想到了这一点,您可以编写将文本添加到文件的代码。 所以我正在考虑编写可以调用的新方法的代码。为此,我必须能够通过字符串名称调用方法。所以我研究了我是否可以做这样的事情。这就是我发现的:

Type thisType = this.GetType();
MethodInfo theMethod = thisType.GetMethod(TheCommandString);
theMethod.Invoke(this, userParameters);

ottobar 的回复here

我知道某些语言不应该用来做某些事情。 像C#一样可以使用vardynamic,但最好尽量避免使用。

我的理解是这是因为 C#(不像 Python 之类的东西)喜欢使用“已知”,而不喜欢“未知”

太久没看:

Type thisType = this.GetType(); 是我应该只在非常特殊的情况下使用的东西吗,比如vardynamic

【问题讨论】:

没有理由回避var;这是一个非常有用的关键字。 有些情况需要反思。 AutoMapper 等映射库使用反射。依赖注入库和 ORM 也是如此。 请关注***.com/q/4868477/6923146 不完全,我知道什么时候使用var,但我也知道不小心使用它是不合适的或不推荐的。我在问 Type 是否应该以同样的方式使用,小心 使用var 是免费的。无论何时使用,编译器都必须完全知道该类型。在某些情况下,唯一的成本是可读性。反射确实有一些成本,特别是当您使用它来查看某些东西时。调用 MethodInfo 比调用函数更昂贵,但也不算多。在您展示的示例中,如果您缓存/记忆theMethod,您将遥遥领先 【参考方案1】:

你应该只使用那个 (...MethodInfo theMethod = thisType.GetMethod(TheCommandString) 当您无权访问方法 (TheCommandString) 或 class 时,因此它主要可用于构建 DI 之类的东西,或者 newtonsoft 或 automapper 之类的库。

所以在您的示例中,如果您有权访问您的方法 (TheCommandString),则应直接调用该方法 (object.TheCommandString(userParameters)),如果您无权访问(例如:它是 dll 中的私有方法),那么你可以使用反射。

【讨论】:

以上是关于使用 C# 的类型(反射)是不好的做法吗? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

对所有成员函数和属性使用“this”是不好的做法吗? [关闭]

在锁中调用方法是不好的做法吗? [关闭]

使用没有花括号的 if 语句是一种不好的做法吗? [关闭]

使用 js 渲染 html 是一种不好的做法吗? [关闭]

使用 app.quit() 关闭电子应用程序中所有打开的窗口是不好的做法吗?

从 React 钩子返回 JSX 元素是不好的做法吗? [关闭]