无法从动态对象中检索信息
本文关键字:检索 信息 对象 动态 | 更新日期: 2023-09-27 18:13:52
考虑下面这段代码
using System;
using System.Collections.Generic;
using System.Linq;
namespace ConsoleApplication2
{
class Program
{
static void Main(string[] args)
{
dynamic val = SearchControlTypes("Panel");
var result = val.SomeMethod();
Console.ReadKey();
}
private static Type SearchControlTypes(string key)
{
return SetControlTypes()[key];
}
private static Dictionary<String, Type> SetControlTypes()
{
var dicControlTypes = new Dictionary<string, Type>();
dicControlTypes.Add("TextBox", typeof(Panel));
dicControlTypes.Add("DateTimePicker", typeof(Panel));
dicControlTypes.Add("RadioButton", typeof(Panel));
dicControlTypes.Add("Panel", typeof(Panel));
dicControlTypes.Add("GroupBox", typeof(GroupBox));
return dicControlTypes;
}
}
internal class Panel
{
public int SomeMethod()
{
return 10;
}
}
internal class GroupBox
{
public int SomeMethod()
{
return 20;
}
}
}
当尝试从
处的特定类检索信息时var result = val.SomeMethod();
获取异常
类型为'Microsoft.CSharp.RuntimeBinder '的未处理异常。在System.Core.dll中发生了RuntimeBinderException附加信息:System.Reflection。TypeInfo'没有包含' someemethod '的定义
问题是什么,如何纠正?
你完全破坏了c#(和。net)的强类型,它使你避免了这样的麻烦。你不应该像现在这样使用Type
,也不应该像现在这样使用dynamic
,除非你对自己正在做的事情了解得更多。
问题是你的dynamic val = SearchControlTypes("Panel");
没有返回你认为它是什么,并且不清楚我上面所说的原因是什么错了。修改你的代码,使你不使用dynamic
。
你的字典Dictionary<string, Type>();
的值不应该是Type
;你应该用Dictionary<string, Control>();
或者其他的基本类型来代替你所有的控件
答案是创建一个由@ror指定的实例。Ap和@mason
Activator.CreateInstance(SearchControlTypes("Panel"))
感谢他们。