一些工具方法
作者:互联网
反射
Unity出的程序在安卓和windows都可以运行时使用反射,IOS不行
反射主要用于在实时获取静态变量,静态方法或者成员变量,成员方法。
主要用于,在一些只能在运行的时候才能确定对哪些成员进行赋值或者调用哪些方法的情况
例如,只能比对字符串找到对应的成员变量,然后对其进行赋值的情况。
这种实时的赋值不像在脚本中先写好对象名.成员名的方式进行赋值,这种情况只有在运行的时候才能确定。
之前在项目中有用到这个东西,需求是在运行时比对某个字符串列表存储的成员名字,然后遍历某个类的反射中的所有成员名字,名字相同的,就用用户设置值赋值,不存在的,就用配置中的默认值赋值。
这主要是为了解决新的安装包对于新添加的用户设置进行默认值赋值而旧的用户设置的继续使用之前的用户设置值。
下面给出测试有效的方法,这个方法最后没有用到项目中:
根据值来获得成员变量的名字
/// <summary>
/// 传入类的非静态成员变量的值的字符串
/// 输出这个字符串对应的非静态成员的变量名
/// 在一个对象的所有内部成员有重复值都很小的时候可以考虑使用 测试有效
/// </summary>
/// <param name="tpye"></param>
/// <param name="s"></param>
public static string GetTypeValue<T>(T t, string s)
{
Type tpye = t.GetType();
FieldInfo[] fieldInfos = tpye.GetFields();
for (int i = 0; i < fieldInfos.Length; i++)
{
if (fieldInfos[i] != null)
{
if (fieldInfos[i].GetValue(t) != null && fieldInfos[i].GetValue(t).ToString() == s)
{
return fieldInfos[i].Name;
}
}
}
return null;
}
使用方式
Test test = new Test();
Type t = test.GetType();
GetTypeValue(t, test.a) //返回变量a的名字字符串
或者
先在类中声明方法,这里是SettingsData
public static string GetClassName() { return System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name; }
然后
Assembly assembly = Assembly.GetExecutingAssembly();
string settingsDataClassName = SettingsData.GetClassName();
//命名空间名.类名
Type type = assembly.GetType(settingsDataClassName);
遍历所有成员名
Assembly assembly = Assembly.GetExecutingAssembly();
if (assembly != null)
{
string settingsDataClassName = SettingsData.GetClassName();
if (settingsDataClassName != null)
{
//命名空间名.类名
Type type = assembly.GetType(settingsDataClassName);
if (type != null)
{
foreach (FieldInfo field in type.GetFields())
{
if (field != null)
{
}
}
}
}
}
标签:assembly,fieldInfos,成员,settingsDataClassName,一些,工具,null,方法,赋值 来源: https://blog.csdn.net/weixin_43149049/article/details/123528317