标签:assembly fieldInfos 成员 settingsDataClassName 一些 工具 null 方法 赋值
反射
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
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。