我正在尝试访问项目中所有用户声明的类。我的目标是调用我访问的类的函数。 我已经研究了2-3天,但找不到任何解决方案。
我试图从汇编中获取类型,但这给了我如此复杂的结果。 这是我尝试过的:
Assembly assembly = AppDomain.CurrentDomain.GetAssemblies();
Type[] types = assembly.GetTypes();
int i;
for ( i = 0 ; i < types.Length ; i++ )
{
Console.WriteLine( types[ i ].Name );
}
快速示例-如果在该项目上工作的任何其他程序员创建了一个名为“ Hello”的类,则需要获取该类并在其中调用所需的函数。
我坚持使用“获取用户/程序员声明的类”部分,任何帮助都很棒。
更新:感谢大家的帮助。 我设法通过创建自定义属性来解决此问题,就像@ Ghost4Man所建议的那样。 我的新代码如下:
public void Test()
{
foreach ( Assembly a in AppDomain.CurrentDomain.GetAssemblies() )
{
Type[] array = a.GetTypes();
for ( int i = 0 ; i < array.Length ; i++ )
{
Type t = array[ i ];
DConsoleRequired dConsoleRequired = ( DConsoleRequired )
t.GetCustomAttributes( typeof( DConsoleRequired ) , false )[ 0 ];
if ( dConsoleRequired != null )
{
Debug.Log( t.Name );
}
}
}
}
更新2:更新了代码
public void Test2()
{
Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies();
Type[] types = new Type[ assemblies.Length ];
int i;
for ( i = 0 ; i < assemblies.Length ; i++ )
{
types = assemblies[ i ].GetTypes();
for ( int j = 0 ; j < types.Length ; j++ )
{
var type = types[ j ];
if ( ConsoleRequiredAttribute.IsDefined( type , typeof( ConsoleRequiredAttribute ) ) )
{
Debug.Log( type.Name );
}
}
}
}
答案 0 :(得分:1)
您可以使用自定义属性注释类,然后通过检查GetCustomAttribute
是否返回null来过滤程序集中的类型:
using System.Reflection;
[AttributeUsage(AttributeTargets.Class)]
class HelloAttribute : Attribute { }
[Hello]
class Hello1 { }
[Hello]
class Hello2 { }
然后:
if (types[i].GetCustomAttribute<HelloAttribute>() != null)
{
// do something with the class
}
或者检查该类是否实现了特定的接口:
if (typeof(IHello).IsAssignableFrom(types[i]))
{
// do something with the class
}
答案 1 :(得分:1)
我写了一个小的控制台应用程序来满足您的需求。您可以动态加载程序集,然后检查其成员。
class Program
{
static void Main(string[] args)
{
var assembly = Assembly.LoadFrom("SomeLibrary.dll");
var types = assembly.GetTypes();
foreach (var type in types)
{
Console.WriteLine($"Type name: {type}");
var functions = type.GetMethods(BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly);
foreach (var function in functions)
{
Console.WriteLine($"Function name: {function.Name}");
var instance = Activator.CreateInstance(type, null, null);
var response = function.Invoke(instance, new[] { "Hello from dynamically loaded assembly" });
Console.WriteLine($"Function response: {response}");
}
}
Console.ReadLine();
}
}
假定您具有带一个字符串参数的所有函数。