考虑下面的代码
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();
获得异常
System.Core.dll中发生未处理的“Microsoft.CSharp.RuntimeBinder.RuntimeBinderException”类型异常 附加信息:'System.Reflection.TypeInfo'不包含'SomeMethod'的定义
问题是什么以及如何纠正?
答案 0 :(得分:0)
你正在彻底摧毁C#(和.NET)的强类型,让你免于这样的麻烦。你不应该像你一样使用Type
,除非你更了解你正在做什么,否则你不应该像你一样使用dynamic
。
问题是你的dynamic val = SearchControlTypes("Panel");
没有回复你的想法,而且由于我上面提到的原因,我们不清楚出了什么问题。修改您的代码,这样您就不会使用dynamic
。
您的字典Dictionary<string, Type>();
的值不应为Type
;您应该使用Dictionary<string, Control>();
代替或基本类型用于所有各种控件。
答案 1 :(得分:0)
答案是创建@ rorry.ap和@mason
指向的实例Activator.CreateInstance(SearchControlTypes("Panel"))
感谢他们。