46 lines
1.6 KiB
C#
46 lines
1.6 KiB
C#
|
using System;
|
||
|
using System.IO;
|
||
|
using System.Linq;
|
||
|
|
||
|
namespace UnityEngine.TestTools
|
||
|
{
|
||
|
internal static class AttributeHelper
|
||
|
{
|
||
|
internal static Type GetTargetClassFromName(string targetClassName, Type attributeInterface)
|
||
|
{
|
||
|
Type targetClass = null;
|
||
|
foreach (var assemblyName in ScriptingRuntime.GetAllUserAssemblies())
|
||
|
{
|
||
|
// we need to pass the assembly name without the .dll extension, so removing that first
|
||
|
var name = Path.GetFileNameWithoutExtension(assemblyName);
|
||
|
targetClass = Type.GetType(targetClassName + "," + name);
|
||
|
if (targetClass != null)
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
if (targetClass == null)
|
||
|
{
|
||
|
Debug.LogWarningFormat("Class type not found: " + targetClassName);
|
||
|
return null;
|
||
|
}
|
||
|
|
||
|
ValidateTargetClass(targetClass, attributeInterface);
|
||
|
return targetClass;
|
||
|
}
|
||
|
|
||
|
private static void ValidateTargetClass(Type targetClass, Type attributeInterface)
|
||
|
{
|
||
|
var constructorInfos = targetClass.GetConstructors();
|
||
|
if (constructorInfos.All(constructor => constructor.GetParameters().Length != 0))
|
||
|
{
|
||
|
Debug.LogWarningFormat("{0} does not implement default constructor", targetClass.Name);
|
||
|
}
|
||
|
|
||
|
if (!attributeInterface.IsAssignableFrom(targetClass))
|
||
|
{
|
||
|
Debug.LogWarningFormat("{0} does not implement {1}", targetClass.Name, attributeInterface.Name);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|