使用字符串引用对象变量名的c#实例

时间:2012-07-31 04:08:34

标签: c# .net silverlight windows-phone-7 reflection

在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',因为它   不是委托类型

2 个答案:

答案 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;