好的,我已经问了一个先前的问题,但是我认为我需要退后一步,问一个不同的问题。
我在这里要做的是为从游戏(改装工具)解码的字段创建一个编辑器,这些文件由第3方库解码并添加到传递回的类中。
现在,该类有1000多个变体,它们都共享基类NMSTemplate
,每个变体都有自己的独特属性,可以是基本对象(字符串,整数)到{的其他变体的集合{1}}。
我已经尝试了多种方法来完成此操作,而最新的操作如下所示
NMSTemplate
然后我将列表视图绑定到此字段集合,并使用数据模板更改其显示方式
IOrderedEnumerable<FieldInfo> fields = template.GetType().GetFields().OrderBy(field => field.MetadataToken);
foreach(FieldInfo f in fields)
{
MBINField field = new MBINField()
{
Name = f.Name,
Value = f.GetValue(null),
NMSType = f.FieldType.Name
};
_fields.Add(field);
}
现在,由于来自FieldInfo的价值问题引起了人们的关注,我意识到当我遇到<DataTemplate x:Key="MbinListTemplate">
<StackPanel Orientation="Vertical">
<TextBlock Text="{Binding Name}"/>
<ListView ItemsSource="{Binding Value}" ItemTemplateSelector="{StaticResource MbinTemplateSelector}" />
</StackPanel>
</DataTemplate>
<DataTemplate x:Key="MbinStringTemplate">
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Name}" />
<TextBox Text="{Binding Value}" />
</StackPanel>
</DataTemplate>
集合的Property时遇到了一个陷阱,我不确定接下来该如何处理动态显示该集合中类的属性。
答案 0 :(得分:1)
我不确定我是否正确回答了您的问题,但是您可以尝试检查字段类型并分别处理每种类型。这是处理类型List<NMSTemplate>
var fields = template.GetType().GetFields().OrderBy(field => field.MetadataToken);
foreach(var f in fields)
{
var isGeneric = f.FieldType.IsGenericType;
var isList = f.FieldType == typeof(List<NMSTemplate>);
if(isGeneric && isList)
{
var value = f.GetValue(template);
var list = (List<NMSTemplate>)value;
foreach(var listEntry in list)
{
// ...
}
}
}
在foreach循环中,您可以创建所有MBINField
对象并将它们添加到_fields
列表中。