Unity2017.3已经发布,其中一大新功能是:程序集定义文件(Assembly Definition File)。
得益于此功能,开发者可以在一个文件夹中自定义程序集。定义明晰的依赖关系,可以确保脚本更改后,只会重新生成必需的程序集,减少编译时间。
项目越大脚本越多,编译时间必然会越长。在进行项目迭代时,这很容易制约效率,因此设置好程序集定义文件可以提高工作效率,减少脚本编译的时间。
在我们使用反射调用相应的方法时,可以定义如下通用方法:
private void ReflectionMethod(Type thisType, string findAssemblyName,
string fullTypeNameContainsNamespace, string methodName,BindingFlags bindingFlags, object[] args)
{
var thisAssembly = thisType.Assembly;
string filePath = thisAssembly.Location.Replace(thisAssembly.GetName().Name + ".dll",
$"{findAssemblyName}.dll");
Assembly ass = Assembly.LoadFile(filePath);
//命名空间和类的名字必须一起指定
Type type = ass.GetType(fullTypeNameContainsNamespace);
type.InvokeMember(methodName, bindingFlags,null, null, args);
}
如果使用反射获取字段或者设置字段的值,使用如下方法:
/// <summary>
/// 动态赋值
/// </summary>
/// <param name="obj"></param>
/// <param name="fieldName"></param>
/// <param name="value"></param>
public static void SetValue(object obj,string fieldName,object value)
{
FieldInfo info = obj.GetType().GetField(fieldName);
info.SetValue(obj, value);
}
/// <summary>
/// 泛型动态赋值
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="obj"></param>
/// <param name="fieldName"></param>
/// <param name="value"></param>
public static void SetValue<T>(object obj, string fieldName, T value)
{
FieldInfo info = obj.GetType().GetField(fieldName);
info.SetValue(obj, value);
}
/// <summary>
/// 动态取值
/// </summary>
/// <param name="obj"></param>
/// <param name="fieldName"></param>
/// <returns></returns>
public static object GetValue(object obj, string fieldName)
{
FieldInfo info = obj.GetType().GetField(fieldName);
return info.GetValue(obj);
}
/// <summary>
/// 动态取值泛型
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="obj"></param>
/// <param name="fieldName"></param>
/// <returns></returns>
public static T GetValue<T>(object obj,string fieldName)
{
FieldInfo info = obj.GetType().GetField(fieldName);
return (T)info.GetValue(obj);
}
|