使用字符串来选择对象属性(Using strings to select Object Proper

2019-10-16 16:15发布

我有一个有点麻烦,用C#程序中,我正在写,它将会是巨大的,如果有人可以帮助。

背景是这样的,不是非常重要,但它就是为什么我需要弄清楚如何做到这一点:

我使用的是数据库的Web服务来检索数据库中的条目信息。 数据库的每个访问回用很多很多属性的对象。 使用数据库条目的ID,你告诉它你想要什么样的信息填写了关于它返回由其中填充要检索的性能数组对象。 数组没有任何财产保留为它的默认值(通常为null)

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

projectFields[0] = Primavera.Ws.P6.Project.ProjectFieldType.(project_properties.Text);

凡project_properties.Text是属性的名称的字符串,我想设置projectFields [0]到。

任何人都可以帮忙吗? 提前致谢 :)

编辑:感谢您的回答家伙。 虽然他们让我得到的值从动态的物体,那是不太什么,我一直在寻找......我并不想检索值,我只希望设置哪个属性projectFields [0]平等了。 例如,假设用户选择标识,因为他们想要返回有关该项目的信息。 要做到这一点,你可以设置:

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

那么我对数据库的调用,我会得到这个项目的对象回来了,已填写的项目编号,而所有其他属性将留给它们的默认值。 基本上,如果我做的这些事例表明顺便说一句,我必须首先检索对象中的所有属性,然后访问该成员的用户感兴趣这将是缓慢/ inefficent,如果我可以让我的方式想要做它的工作。

我知道这是奇怪的数据库访问方式,但我使用的Web服务,所以我不必改变对调用数据库的任何选项。

Answer 1:

你也许可以达到你想要通过反射(什么例子 ),但我得到一个不同的感觉,有可能是你的系统的设计问题。



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

    }
}

我同意这表明这可能显示的是稍有可怕的设计,其他的答案...



Answer 3:

你可以使用反射-见酒店信息类。



文章来源: Using strings to select Object Properties
标签: c# oop