一直都大概知道个意思,从来没实践过,今天花了一点时间实践了一下。
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());
}
}
}
}