您的位置:首页 > 其它

反射实践(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

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());
}
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: