C# 使用字符串选择对象属性

C# 使用字符串选择对象属性,c#,oop,C#,Oop,我正在写的一个C程序有点问题,如果有人能帮我,那就太好了 背景是这样的,不是很重要,但这就是为什么我需要找出如何做到这一点: 我正在使用数据库的Web服务来检索有关数据库中某个条目的信息。每次访问数据库都会返回一个具有许多属性的对象。使用数据库项的ID,通过填充要检索的属性的数组,告诉它要填充关于它返回的对象的哪些信息。数组中不包含的任何属性都保留为默认值,通常为null 问题是: 我希望用户能够选择一个对象的属性而不是获取该值,只需选择以下属性: projectFields[0] = Prim

我正在写的一个C程序有点问题,如果有人能帮我,那就太好了

背景是这样的,不是很重要,但这就是为什么我需要找出如何做到这一点:

我正在使用数据库的Web服务来检索有关数据库中某个条目的信息。每次访问数据库都会返回一个具有许多属性的对象。使用数据库项的ID,通过填充要检索的属性的数组,告诉它要填充关于它返回的对象的哪些信息。数组中不包含的任何属性都保留为默认值,通常为null

问题是: 我希望用户能够选择一个对象的属性而不是获取该值,只需选择以下属性:

projectFields[0] = Primavera.Ws.P6.Project.ProjectFieldType.(project_properties.Text);
其中project_properties.Text是我要将projectFields[0]设置为的属性名称的字符串

有人能帮忙吗?提前感谢:

编辑:谢谢你们的回答。虽然它们确实让我能够动态地从对象中获取值,但这并不是我想要的。。。我不想检索一个值,我只想设置哪个属性projectFields[0]也相等。例如,假设用户选择Id作为他们想要返回的关于项目的信息。为此,我设置:

projectFields[0]=Primavera.Ws.P6.Project.ProjectFieldType.Id

然后我会调用数据库,然后我会得到项目对象,该项目的Id已经填写完毕,而所有其他属性将保留为默认值。基本上,如果我按照这些示例所建议的方式进行操作,我必须首先检索对象中的每个属性,然后访问用户感兴趣的成员,如果我能够使我尝试的方法起作用,那么访问速度会很慢/效率会很低


我知道访问数据库的方式很奇怪,但我使用的是web服务,因此我没有任何选项来更改对数据库的调用。

C是一种静态类型语言。编译器想知道您在编译时所指的属性

但是,如果愿意,您可以使用反射来实现这一点。或者,如果您事先知道数据的类型,可以使用switch语句。这两种方法的示例即将出现

using System;
using System.Reflection;

public class Demo
{
    public string Foo { get; set; }
    public string Bar { get; set; }
    public string Baz { get; set; }
}

public class Test
{
    static void Main()
    {
        Demo demo = new Demo { 
            Foo = "foo value", 
            Bar = "bar value", 
            Baz = "surprise!"
        };
        ShowProperty(demo, "Foo");
        ShowProperty(demo, "Bar");
        ShowProperty(demo, "Baz");
        ShowDemoProperty(demo, "Foo");
        ShowDemoProperty(demo, "Bar");
        ShowDemoProperty(demo, "Baz");
    }

    // Here we don't know the type involved, so we have to use reflection
    static void ShowProperty(object x, string propName)
    {
        PropertyInfo property = x.GetType().GetProperty(propName);
        if (property == null)
        {
            Console.WriteLine("No such property: {0}", propName);
        }
        else
        {
            Console.WriteLine("{0}: {1}", propName,
                                          property.GetValue(x, null));
        }
    }

    // Here we *know* it's a Demo
    static void ShowDemoProperty(Demo demo, string propName)
    {
        string value;

        // Note that this is very refactoring-unfriendly. Generally icky!
        switch (propName)
        {
            case "Foo": value = demo.Foo; break;
            case "Bar": value = demo.Bar; break;
            case "Baz": value = demo.Baz; break;
            default:
                Console.WriteLine("No such property: {0}", propName);
                return;
        }
        Console.WriteLine("{0}: {1}", propName, value);

    }
}

我同意其他答案,这些答案表明这可能显示了一个有点可怕的设计…

C是一种静态类型语言。编译器想知道您在编译时所指的属性

但是,如果愿意,您可以使用反射来实现这一点。或者,如果您事先知道数据的类型,可以使用switch语句。这两种方法的示例即将出现

using System;
using System.Reflection;

public class Demo
{
    public string Foo { get; set; }
    public string Bar { get; set; }
    public string Baz { get; set; }
}

public class Test
{
    static void Main()
    {
        Demo demo = new Demo { 
            Foo = "foo value", 
            Bar = "bar value", 
            Baz = "surprise!"
        };
        ShowProperty(demo, "Foo");
        ShowProperty(demo, "Bar");
        ShowProperty(demo, "Baz");
        ShowDemoProperty(demo, "Foo");
        ShowDemoProperty(demo, "Bar");
        ShowDemoProperty(demo, "Baz");
    }

    // Here we don't know the type involved, so we have to use reflection
    static void ShowProperty(object x, string propName)
    {
        PropertyInfo property = x.GetType().GetProperty(propName);
        if (property == null)
        {
            Console.WriteLine("No such property: {0}", propName);
        }
        else
        {
            Console.WriteLine("{0}: {1}", propName,
                                          property.GetValue(x, null));
        }
    }

    // Here we *know* it's a Demo
    static void ShowDemoProperty(Demo demo, string propName)
    {
        string value;

        // Note that this is very refactoring-unfriendly. Generally icky!
        switch (propName)
        {
            case "Foo": value = demo.Foo; break;
            case "Bar": value = demo.Bar; break;
            case "Baz": value = demo.Baz; break;
            default:
                Console.WriteLine("No such property: {0}", propName);
                return;
        }
        Console.WriteLine("{0}: {1}", propName, value);

    }
}

我同意其他答案,这些答案表明这可能是一个有点可怕的设计…

你可能可以通过反射实现你想要的,但我有一种明显的感觉,你的系统设计可能有问题。

你可能可以通过反射实现你想要的,但是我有一种明显的感觉,就是你的系统设计可能有问题。

你可以使用反射-见类。

你可以使用反射-见类。

当然是重复的。。。看起来…当然是复制品。。。看。。。