Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 检索嵌套对象的PropertyDescriptor_C#_Nested Class_Propertydescriptor - Fatal编程技术网

C# 检索嵌套对象的PropertyDescriptor

C# 检索嵌套对象的PropertyDescriptor,c#,nested-class,propertydescriptor,C#,Nested Class,Propertydescriptor,我有以下代码: public partial class Form1 : Form { public Form1() { InitializeComponent(); object o; Person p = new Person { FirstName = "John", Surname = "Henry" }; Citizen c = new Citizen { Country = "Canada", Resid

我有以下代码:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        object o;
        Person p = new Person { FirstName = "John", Surname = "Henry" };
        Citizen c = new Citizen { Country = "Canada", ResidentName = p };
        SportsFan sf = new SportsFan { Sport = "Hockey", Fan = c };

        Discoverer<SportsFan>.SimpleExample("Sport", "Hockey",out o);
        Discoverer<SportsFan>.NestedProperyExample("Fan.Citizen.FirstName", "John",out o);
    }

    private class Person
    {
        public string FirstName
        {
            get; set;
        }

        public string Surname
        {
            get; set;
        }
    }

    private class Citizen
    {
        public Person ResidentName
        {
            get; set;
        }

        public string Country
        {
            get; set;
        }
    }

    private class SportsFan
    {
        public string Sport
        {
            get; set;
        }

        public Citizen Fan
        {
            get; set;
        }
    }

    private class Discoverer<T>
    {
        public static void SimpleExample(string propName, string objResultToString,out Object obj)
        {
            PropertyDescriptor propDesc;
            propDesc = TypeDescriptor.GetProperties(typeof(T))[propName];               

            TypeConverter converter = TypeDescriptor.GetConverter(propDesc.PropertyType);
            obj = converter.ConvertFromString(objResultToString);                   
        }

        public static void NestedProperyExample(string propName, string objResultToString, out Object obj)
        {
            PropertyDescriptor propDesc = null;
            obj = null;
            string[] nestedProperties = propName.Split(new char[] { '.' }, StringSplitOptions.RemoveEmptyEntries);

            propDesc = TypeDescriptor.GetProperties("Form1." + nestedProperties[0])[nestedProperties[1]];
            for (int i = 1; i < nestedProperties.Length - 1; i++)
            {
                if (propDesc != null)
                    propDesc = TypeDescriptor.GetProperties(propDesc.GetType())[nestedProperties[i + 1]];
            }

            if (propDesc != null)
            {
                TypeConverter converter = TypeDescriptor.GetConverter(propDesc.PropertyType);
                obj = converter.ConvertFromString(objResultToString);
            }

        }
    }


}
公共部分类表单1:表单
{
公共表格1()
{
初始化组件();
对象o;
人p=新人{FirstName=“John”,姓氏=“Henry”};
公民c=新公民{Country=“Canada”,居民姓名=p};
体育迷sf=新体育迷{Sport=“Hockey”,Fan=c};
发现者。简单的例子(“运动”,“曲棍球”,out o);
Discoverer.nestedPropertyExample(“Fan.Citizen.FirstName”,“John”,out o);
}
私人阶级人士
{
公共字符串名
{
获得;设置;
}
公共字符串姓氏
{
获得;设置;
}
}
私人阶层公民
{
公众人士住址
{
获得;设置;
}
公共字符串国家
{
获得;设置;
}
}
私人体育爱好者
{
公共弦乐运动
{
获得;设置;
}
市民范
{
获得;设置;
}
}
私人类发现者
{
公共静态void SimpleExample(字符串propName、字符串objResultToString、out对象obj)
{
PropertyDescriptor propDesc;
propDesc=TypeDescriptor.GetProperties(typeof(T))[propName];
TypeConverter converter=TypeDescriptor.GetConverter(propDesc.PropertyType);
obj=converter.ConvertFromString(objResultToString);
}
公共静态void nestedPropertyExample(字符串propName、字符串objResultToString、out对象obj)
{
PropertyDescriptor propDesc=null;
obj=null;
string[]nestedProperties=propName.Split(新字符[]{.'.},StringSplitOptions.RemoveEmptyEntries);
propDesc=TypeDescriptor.GetProperties(“Form1.+nestedProperties[0])[nestedProperties[1]];
for(int i=1;i
该代码适用于
simpleExample
。在
NestedPropertyExample
上,对
PropDesc
的第一个赋值返回
null
。当我选中
TypeDescriptor.GetProperties(“Form1.+nestedProperties[0])
时,它返回一个项目的
PropertyDescriptorCollection
,即长度

为什么我不返回更多的
PropertyDesriptor
项目?我这样做对吗


谢谢,Bill N

NestedPropertyExample
方法有点拼写错误,但请不要介意--这不是问题所在(:实际上,问题可能是,
NestedPropertyExample
方法调用
TypeDescriptor.GetProperties(Object)
重载,传递一些字符串
(“Form1.+nestedProperties[0]))
。根据docs(),它的作用非常类似于
TypeDescriptor。GetProperties(typeof(string))
string
只有一个简单的属性,即它的
Length
,这就是
TypeDescriptor的原因。GetProperties
不再返回任何
PropertyDescriptor

这回答了您的直接问题,但我不清楚您的意图。可能是如果您可以重新表述您的问题,并清楚地说明您试图用此代码实现什么,您可能会得到更好的答案