Articles of reflection

使用属性调用方法

我有各种各样的方法,在继续自己的实现之前都需要执行相同的function。 现在我可以在每个方法中实现这些函数,但我想知道是否有办法利用attributes来执行此操作? 作为一个非常简单的示例,所有网络呼叫都必须检查网络连接。 public void GetPage(string url) { if(IsNetworkConnected()) … else … } 这可以工作,但我必须为使用网络的每个方法调用IsNetworkConnected方法并单独处理它。 相反,我想这样做 [NetworkCall] public void GetPage(string url) { … } 如果网络不可用,则会调用错误方法,并忽略GetPage ,否则将调用GetPage 。 这听起来非常像Aspect Orientated Programming,但我不想为几个调用实现整个框架。 这更像是一个学习练习而不是实现练习,所以我很好奇这样的事情是如何最好地实现的。

创建运行时确定类型实例的最佳方法

在.NET 4中创建在运行时确定的类型实例的最佳方法是什么? 我有一个实例方法,虽然作用于BaseClass对象可能会被其派生类的实例调用。 我需要在方法中创建与this类型相同的另一个实例。 为每个派生类重载Method是不切实际的,因为它相当复杂,并且更有效地保持单个实现。 public class BaseClass { //constructors + properties + methods etc public SomeMethod() { //some code DerivedClass d = new DerivedClass(); //ideally determine the DerivedClass type at run-time } } 我已经阅读了一些关于reflection或使用动态关键字但我没有这些经验。

如何在Windowsapp store应用中获取执行的汇编版本信息?

在将应用程序移植到Windowsapp store时,我注意到.NETCore Framework不包括: System.Reflection.Assembly.GetExecutingAssembly() 我用它来获取显示在菜单屏幕上的版本信息。 是否有替代品,或者我被迫将信息存储在别处以供检索? 编辑: 我还发现我可以从typeof(MyType).AssemblyQualifiedName提取一个版本号,但这看起来很糟糕。

如何使用reflection创建“reflection机器”

好吧,所以标题很糟糕,但我想不出更好的东西(也许其他人可以?)。 所以我在这里围绕一个主题提出几个问题。 我想要做的是创建一个程序,可以获取一个对象并使用reflection列出它的所有属性,方法,构造函数等。然后我可以在运行时操作这些对象来测试,调试和确切地知道我的一些类/程序在运行时正在进行,(其中一些是Windows服务,可能安装在机器上,而不是从VS调试运行)。 所以我会为程序提供一个钩子,从本地机器(仅)这个程序可以获得主对象的实例,因此可以看到在其中运行的所有子对象。 (为了安全起见,可能需要使用arg启动程序以公开该钩子)。 “reflection机器”将允许运行时操作和询问。 听起来有可能吗? 程序是否必须提供一个钩子,或者“reflection机器”可以使用EXE并且(如果它知道它正在使用的所有类),创建一个要使用的对象? 我知道你可以在运行时导入DLL,以便它知道各种类,但是你可以导入单个类吗? IE说我有没有编译成DLL的项目’Y’但是我想在它上面使用“reflection机器”,我可以指向该目录并获取文件以便能够引用这些类吗? 编辑:我想尝试自己开发它,但我已经有一长串项目,我想做,已经开始。 当有很多可供选择的选择时,为什么要重新发明轮子。

我如何使用Activator.CreateInstance与字符串?

在我的reflection代码中,我遇到了我的通用代码部分的问题。 特别是当我使用一个字符串。 var oVal = (object)”Test”; var oType = oVal.GetType(); var sz = Activator.CreateInstance(oType, oVal); 例外 An unhandled exception of type ‘System.MissingMethodException’ occurred in mscorlib.dll Additional information: Constructor on type ‘System.String’ not found. 我试过这个用于测试目的,它也发生在这个单一的衬里 var sz = Activator.CreateInstance(“”.GetType(), “Test”); 我最初写的 var sz = Activator.CreateInstance(“”.GetType()); 但是我得到了这个错误 Additional information: No parameterless constructor defined for this object. 如何使用reflection创建字符串?

是否可以使用reflection设置静态类的静态私有成员?

我有一个带有static private readonly成员的static class ,它通过类的static constructor 。 下面是一个简化的例子。 public static class MyClass { private static readonly string m_myField; static MyClass() { // logic to determine and set m_myField; } public static string MyField { get { // More logic to validate m_myField and then return it. } } } 由于上面的类是一个静态类,我无法创建它的实例,以便将这样的传递用于FieldInfo.GetValue()调用以检索并稍后设置m_myField的值。 有没有一种方法我不知道要么使用FieldInfo类来获取和设置静态类的值,还是唯一的选择是重构我被要求进行unit testing的类?

C#对象到数组

使用reflection我有一个对象,我需要将其转换为可迭代的项目列表(类型未知,将是对象)。 使用Watch窗口我可以看到我的对象是某种类型的数组,因为它告诉我元素的数量,我可以爆炸树视图来查看元素本身。 首先,我需要检查传递的对象是某种数组(可能是List,可能是object []等)。 然后我需要遍历该数组。 但是,我无法进行类型转换。 这是我如何使用它(缩写): private static void Example(object instance, PropertyInfo propInfo) { object anArray = propInfo.GetValue(instance, null); ArrayList myList = anArray as ArrayList; foreach (object element in myList) { // etc } } 我尝试了各种不同的演员阵容。 以上不会引发exception,但是当anArray实际存在且包含项目时,mylist为null。 保存的实际实例是强类型List ,但如果需要,可以采用有限的表单子集。 但是练习的重点是这个Example()方法不知道属性的基本类型。

预加载.NET程序集的好方法

在我的应用程序中,我需要在鼠标单击时显示一个表单。 问题是表单是在另一个程序集中,并且由于程序集加载的惰性,很可能在按下鼠标按钮时尚未加载程序集。 因此,在表单最终出现之前,我所拥有的是非常明显的暂停。 通过在初始化方法中调用new FormFromAnotherAssembly() ,我能够得到一个愚蠢的修复。 当然,这会照顾好事情,停顿不再存在,但它非常难看。 我唯一喜欢这个解决方案的是,如果我想使用像Assembly.Load这样的东西,我不必弄乱路径和程序集名称。 那么,如果我想确保在实际需要之前加载程序集,那么选择好的,强大的解决方案是什么? 提前致谢。

pt 2,无法捕捉的例外

更新:我已经在Microsoft Connect上提交了错误报告: https : //connect.microsoft.com/VisualStudio/feedback/details/568271/debugger-halting-on-exception-thrown-inside-methodinfo-invoke#details 如果您可以在您的计算机上重现此问题,请提供该错误以便修复它! 好的,我已经做了一些测试,我把问题简化为非常简单的事情: 一世。 在抛出exception的新类中创建方法: public class Class1 { public void CallMe() { string blah = null; blah.ToLower(); } } II。 创建一个MethodInfo,在其他地方指向此方法: Type class1 = typeof( Class1 ); Class1 obj = new Class1(); MethodInfo method = class1.GetMethod( “CallMe” ); III。 在try / catch块中包含对Invoke()的调用: try { method.Invoke( obj, null ); // exception […]

如何使用reflection来确定一个类是否是内部的?

正如标题所说,如何使用reflection来检查类定义是否定义为内部? “typeof(…)”返回下面显示的某些属性,但不返回类是否定义为内部属性。 看了谷歌,但我能找到的很多关于使用reflection运行内部或受保护方法的文章。 这不是我对这种情况感兴趣的方法,而是类定义。 var type = typeof(Customer); Assert.IsTrue(type.IsClass); Assert.That(type.IsAbstract, Is.EqualTo(isAbstract)); Assert.That(type.IsPublic, Is.EqualTo(isPublic)); Assert.That(type.IsPublic, Is.EqualTo(isPublic)); Assert.That(type.IsSealed, Is.EqualTo(isSealed)); Assert.That(type.IsSerializable, Is.EqualTo(isSerializable));