使用 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#一样可以使用var
或dynamic
,但最好尽量避免使用。
我的理解是这是因为 C#(不像 Python 之类的东西)喜欢使用“已知”,而不喜欢“未知”
太久没看:
Type thisType = this.GetType();
是我应该只在非常特殊的情况下使用的东西吗,比如var
和dynamic
?
【问题讨论】:
没有理由回避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”是不好的做法吗? [关闭]