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

本文关键字:检索 信息 对象 动态 | 更新日期: 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"))

感谢他们。