使用字符串选择对象属性

时间:2009-06-23 20:01:32

标签: c# oop

我在编写一个C#程序时遇到了一些麻烦,如果有人可以提供帮助,那就太棒了。

背景是这个,并不是非常重要,但这就是我需要弄清楚如何去做的原因:

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

问题:   我希望用户能够选择Object的属性(不是获取值,只选择哪个属性),如下所示:

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;

然后我会调用数据库,然后我将项目Object返回,项目已填写了Id,而所有其他属性都将保留为默认值。基本上,如果我按照这些示例的方式进行操作,我必须首先检索Object中的每个属性,然后访问用户感兴趣的成员,如果我可以按照我的方式进行操作,这将是缓慢/无效的我试图做到这一点。

我知道如何访问数据库很奇怪,但我正在使用Web服务,所以我没有选择更改有关数据库调用的任何内容。

3 个答案:

答案 0 :(得分:4)

您可以通过Reflection(example)实现您想要的效果,但我明白感觉您的系统设计可能存在问题。

答案 1 :(得分:2)

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);

    }
}

我同意其他答案,这些答案表明这可能显示出一种有点可怕的设计......

答案 2 :(得分:0)

您可以使用反射 - 请参阅property info class。