我在编写一个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服务,所以我没有选择更改有关数据库调用的任何内容。
答案 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。