无法从动态对象中检索信息

时间:2016-10-19 14:17:55

标签: c#

考虑下面的代码

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'的定义

问题是什么以及如何纠正?

2 个答案:

答案 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"))

感谢他们。