ReflectionMagic 5.0.1
dotnet add package ReflectionMagic --version 5.0.1
NuGet\Install-Package ReflectionMagic -Version 5.0.1
<PackageReference Include="ReflectionMagic" Version="5.0.1" />
paket add ReflectionMagic --version 5.0.1
#r "nuget: ReflectionMagic, 5.0.1"
// Install ReflectionMagic as a Cake Addin #addin nuget:?package=ReflectionMagic&version=5.0.1 // Install ReflectionMagic as a Cake Tool #tool nuget:?package=ReflectionMagic&version=5.0.1
ReflectionMagic
私有反射允许您访问其他程序集中的私有和内部成员。通常,被认为是一件坏事,因为它将您与可能以后破坏您的非官方实现细节绑定。此外,它在中信任度下不可用。
此库的目的并不是鼓励任何人在本可以不这样做的情况下使用私有反射。相反,目的是在您决定需要使用它时允许您更容易地做到这一点。
换一种说法,我并不是告诉你要违法,但我告诉你如何更有效地违法,如果你感兴趣的话!
场景
假设你在使用一个包含如下代码的库:
public class Foo1
{
private Foo2 GetOtherClass()
{
// Omitted
}
}
internal class Foo2
{
private string SomeProp { get { /* Omitted */ } }
}
并且假定你有一个公共类 Foo1 的实例 foo1,而你邪恶的自我告诉你要调用其私有方法 GetOtherClass(),然后获取该方法的 SomeProp 属性。
使用反射
使用普通的反射,这可能是这样的:
object foo2 = typeof(Foo1).InvokeMember("GetOtherClass",
BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.InvokeMethod,
null, foo1, null);
PropertyInfo propInfo = foo2.GetType().GetProperty("SomeProp",
BindingFlags.Instance | BindingFlags.NonPublic);
string val = (string)propInfo.GetValue(foo2, null);
这是可行的,但看起来相当糟糕。
使用 ReflectionMagic
做同样的事情,但这次使用 ReflectionMagic 库
string val = foo1.AsDynamic().GetOtherClass().SomeProp;
下载
此库可通过 NuGet 获取。
更多信息
更多详情,请查看 David Ebbo 的原始博客文章:https://blogs.msdn.microsoft.com/davidebb/2010/01/18/use-c-4-0-dynamic-to-drastically-simplify-your-private-reflection-code/
已知限制
.NET Core 1.x 运行时不可用对 'out' 和 'ref' 参数的支持。这是一个运行时限制,会导致 PlatformNotSupportedException。
产品 | 版本 兼容和额外计算的目标框架版本。 |
---|---|
.NET | net5.0已计算。 net5.0-windows已计算。 net6.0兼容。 net6.0-android已计算。 net6.0-ios已计算。 net6.0-maccatalyst已计算。 net6.0-macos已计算。 net6.0-tvos已计算。 net6.0-windows已计算。 net7.0已计算。 net7.0-android已计算。 net7.0-ios已计算。 net7.0-maccatalyst已计算。 net7.0-macos已计算。 net7.0-tvos已计算。 net7.0-windows已计算。 net8.0已计算。 net8.0-android已计算。 net8.0-browser已计算。 net8.0-ios已计算。 net8.0-maccatalyst已计算。 net8.0-macos已计算。 net8.0-tvos已计算。 net8.0-windows已计算。 |
.NET Core | netcoreapp2.0 已计算。 netcoreapp2.1 已计算。 netcoreapp2.2 已计算。 netcoreapp3.0 已计算。 netcoreapp3.1 已计算。 |
.NET标准 | netstandard2.0 兼容。 netstandard2.1 已计算。 |
.NET Framework | net461 已计算。 net462 兼容。 net463 已计算。 net47 已计算。 net471 已计算。 net472 已计算。 net48 已计算。 net481 已计算。 |
MonoAndroid | monoandroid 已计算。 |
MonoMac | monomac 已计算。 |
MonoTouch | monotouch 已计算。 |
Tizen | tizen40 已计算。 tizen60 已计算。 |
Xamarin.iOS | xamarinios 已计算。 |
Xamarin.Mac | xamarinmac 已计算。 |
Xamarin.TVOS | xamarintvos 已计算。 |
Xamarin.WatchOS | xamarinwatchos 已计算。 |
-
.NETFramework 4.6.2
- Microsoft.CSharp (>= 4.7.0)
-
.NETStandard 2.0
- Microsoft.CSharp (>= 4.7.0)
-
net6.0
- 无依赖项。
NuGet 包 (26)
显示依赖 ReflectionMagic 的前 5 个 NuGet 包
包 | 下载 |
---|---|
Lime.Transport.WebSocket
C# LIME WebSocket 传输库 |
|
RazorGenerator.Testing
允许对预编译的 Razor 视图进行单元测试的辅助工具 |
|
Wyam.Less Wyam 是一个简单易用、高度模块化和极其可配置的静态内容生成器。此库提供了解析 Less CSS 内容的支持。 |
|
Kledex
Kledex是一个.NET Core框架,可用来创建简单而清晰的设计,通过强制执行单一责任和关注点的分离。其高级功能非常适合领域驱动设计(DDD)、命令查询责任分离(CQRS)和事件溯源。Kledex还支持Azure Service Bus和RabbitMQ的集成。 |
|
MoeLib.Web
MoeLib.Web |
GitHub 仓库 (9)
显示依赖ReflectionMagic的GitHub最受欢迎的前5个仓库
仓库 | 星标 |
---|---|
Tyrrrz/DiscordChatExporter
将Discord聊天记录导出为文件
|
|
rnwood/smtp4dev
smtp4dev - 用于开发和测试的模拟SMTP邮件服务器
|
|
UiPath/CoreWF
将WF运行时移植到.NET 6上运行的版本
|
|
CodeMazeBlog/CodeMazeGuides
所有Code Maze指南的主仓库
|
|
RazorGenerator/RazorGenerator
Visual Studio的自定义工具,允许在运行时而不是设计时处理Razor文件,从而允许它们被构建到程序集以便更容易重用和分发。
|
版本 | 下载 | 最后更新 |
---|---|---|
5.0.1 | 68,535 | 1/29/2024 |
5.0.0 | 127,105 | 6/9/2023 |
4.1.0 | 2,348,769 | 6/24/2019 |
4.1.0-beta1 | 1,038 | 6/17/2019 |
4.0.0 | 133,108 | 11/15/2018 |
4.0.0-beta1 | 1,209 | 9/10/2018 |
3.2.0-beta1 | 4,312 | 5/29/2018 |
3.1.0 | 533,887 | 11/13/2017 |
3.1.0-beta1 | 1,329 | 11/1/2017 |
3.0.0 | 119,486 | 3/9/2017 |
3.0.0-beta5 | 2,538 | 12/27/2016 |
3.0.0-beta1 | 1,486 | 11/22/2016 |
2.1.0 | 106,144 | 12/31/2014 |
2.0.3 | 53,150 | 10/14/2014 |
2.0.2 | 19,932 | 3/7/2014 |
2.0.0 | 191,854 | 4/26/2013 |
1.1.0 | 101,831 | 10/27/2011 |
1.0.1 | 46,577 | 8/10/2011 |