反射实践(assembly reflection attribute)
2012-08-23 00:58
260 查看
一直都大概知道个意思,从来没实践过,今天花了一点时间实践了一下。
1. 先从assembly里找type
2. 判断type的attribute是否是自己想要的
3. 从type里找member
4. 判断member的attribute
5. 实例化type
6. invoke function
要被反射的assembly
找想要的attribute,再invoke
1. 先从assembly里找type
2. 判断type的attribute是否是自己想要的
3. 从type里找member
4. 判断member的attribute
5. 实例化type
6. invoke function
要被反射的assembly
namespace ConsoleApplication1 { class MyFunction1Attribute : Attribute { } class MyClass1Attribute : Attribute { } class MyFunction2Attribute : Attribute { } class MyClass2Attribute : Attribute { } [MyClass1] class MyClass1 { [MyFunction1] public void VoidFunc1() { Console.WriteLine("MyClass1::VoidFunc1"); } [MyFunction2] public void VoidFunction2() { Console.WriteLine("MyClass1::VoidFunction2"); } public int data; } [MyClass2] class MyClass2 { [MyFunction1] public void VoidFunc1() { Console.WriteLine("MyClass2::VoidFunc1"); } [MyFunction2] public void VoidFunc2() { Console.WriteLine("MyClass2::VoidFunc2"); } public int data; } }
找想要的attribute,再invoke
namespace ConsoleApplication1 { class Program { public static void Main(string[] args) { int _class = 2; int _func = 1;
string expectedClass = "consoleapplication1.myclass"+_class+"attribute";
string expectedFunciton = "consoleapplication1.myfunction"+_func+"attribute"; try { Assembly a = Assembly.LoadFile(@"..\MyClasses.dll"); foreach (Type t in a.GetTypes()) { foreach (object oMyClass1Attribute in t.GetCustomAttributes(false)) { Attribute myClass1Attribute = oMyClass1Attribute as Attribute; if (myClass1Attribute.ToString().Equals(expectedClass, StringComparison.InvariantCultureIgnoreCase)) { foreach (MethodInfo mi in t.GetMethods()) { foreach(object oMyFunciton1Attribute in mi.GetCustomAttributes(false)) { Attribute myFunction1Attibute = oMyFunciton1Attribute as Attribute; if (myFunction1Attibute.ToString().Equals(expectedFunciton , StringComparison.InvariantCultureIgnoreCase)) { ConstructorInfo ci = t.GetConstructor(new Type[] { }); object myClass1Instance = ci.Invoke(new object[] { }); mi.Invoke(myClass1Instance, new object[] { }); } } } } } } } catch (Exception ex) { Console.WriteLine(ex.ToString()); } } } }
相关文章推荐
- C#_Assembly-Reflection_程序集与反射 练习<一> 记事本插件编写
- C#_Assembly-Reflection_程序集与反射 练习<二> 记事本插件编写
- 程序集(Assembly)与反射(reflection)
- [转]System.Reflection.AssemblySignatureKeyAttribute
- 反射 Reflection 和 属性 attribute
- C#_Assembly-Reflection_程序集与反射
- C# 入门(19) 反射(reflection)和特性(attribute)
- Kotlin-35.反射(Reflection)
- 反射(Reflection)
- C#反射(Reflection)
- C#反射的Assembly的简单应用
- (转载)公共技术点之 Java 反射 Reflection
- (Reflection)认识反射(反射实例化,反射评价,在工厂三层架构应用)
- C# 关于反射类[System.Reflection] 根据类名 动态调用 类方法
- 使用反射(Reflection)API
- C#反射Assembly 具体说明
- 反射:Type and Reflection
- Java的反射机制(Reflection)
- Java 反射最佳实践
- C# 反射(Reflection)