在Windows 7手机(Silverlight平台)中,创建ListBox时,会对该ListBox的名称进行实例化并将其分配给同名变量:
<ListBox Name="abcFeed" ...
用作:
abcFeed.ItemsSource = feed.Items;
在我的应用中,我有很多源,并希望将它们分配给各自的ListBox。我在字典字典中有列表框的名称。
this.feeds["abcFeed"] = "http://feed.abc.com/....";
this.feeds["nbcFeed"] = "http://feed.nbc.com/....";
但除了使用开关将提要分配给ListBoxes之外,我想从我的字典中获取ListBox字符串名称并在循环中动态调用实例。
例如,而不是:
feedName = "nbcFeed";
// Bind the list of SyndicationItems to our ListBox.
switch (feedName)
{
case "abcFeed":
abcFeed.ItemsSource = feed.Items;
break;
case "nbcFeed":
nbcFeed.ItemsSource = feed.Items;
break;
}
我想以某种方式拿字典键并调用 实例化变量名,如:
feedName = "nbcFeed";
// nbcFeed.ItemsSource = feed.Items;
((ListBox) feedName).ItemsSource = feed.Items;
我已经研究过Reflection,Assembly和Activator.CreateInstance()(虽然我已经知道了这个实例)但是我没有清楚地了解这是否可行。
可以这样做还是我坚持使用开关?
我也尝试过:
this.GetType().GetProperty(feedName).ItemsSource = feed.Items;
但是我收到了错误:
无法将lambda表达式转换为类型'System.Delegate',因为它 不是委托类型
答案 0 :(得分:2)
不幸的是,您无法使用反射访问XAML中定义的字段。 Silverlight中的安全限制阻止访问NonPublic字段(例如为XAML元素生成的字段)。
使用FindName应该可以正常工作。
ListBox abcFeed = LayoutRoot.FindName("abcFeed") as ListBox;
答案 1 :(得分:1)
是的,Reflection
是你需要做的。但是这个:
this.GetType()。GetProperty(feedName).ItemsSource = feed.Items;
不起作用,因为Type.GetProperty()
方法返回PropertyInfo
(因为Type.GetMethod()
返回MethodInfo
等等......)所以你应该使用PropertyInfo.GetValue()
如果你想处理属性值,可以使用PropertyInfo.SetValue()
方法。
在你的情况下,这可能有效:
var myProperty = (ItemsControl)GetType().GetProperty(feedName).GetValue(this, null);
myProperty.ItemsSource = feed.Items;