问题描述
我想通过VisualElement使用新的UIElement为Enum标志字段创建自定义属性抽屉。
通过查看Unity的源代码,我发现他们使用以下代码实现了这一目标。
Type enumType;
ScriptAttributeUtility.GetFieldInfoFromProperty(property,out enumType); //internal
if (enumType.IsDefined(typeof(FlagsAttribute),false))
{
var field = new EnumFlagsField();
field.choices = property.enumdisplayNames.ToList(); //field.choices - internal
field.value = (Enum)Enum.ToObject(enumType,property.intValue);
return ConfigureField<EnumFlagsField,Enum>(field,property); //Adds styling and events
}
问题是这段代码的一部分是内部的,而我可以像这样替换第一次调用以获取fieldInfo
var enumType = property.serializedobject.targetobject.GetType().GetFields(BindingFlags.Instance)
.First(info => info.Name == property.name).FieldType;
问题:如何设置field.choices
不加思考。有没有其他方法可以使用UIElements创建多选弹出式元素?
当前有效的解决方案(使用反射)
var enumType = property.serializedobject.targetobject.GetType().GetFields(BindingFlags.Instance)
.First(info => info.Name == property.name).FieldType;
if (enumType.IsDefined(typeof(FlagsAttribute),false))
{
var field = new EnumFlagsField();
field.GetType().GetField("choices").SetValue(field,property.enumdisplayNames.ToList());
field.value = (Enum)Enum.ToObject(enumType,property); //Adds styling and events
}
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)