C# 使用字符串选择对象属性
我正在写的一个C程序有点问题,如果有人能帮我,那就太好了 背景是这样的,不是很重要,但这就是为什么我需要找出如何做到这一点: 我正在使用数据库的Web服务来检索有关数据库中某个条目的信息。每次访问数据库都会返回一个具有许多属性的对象。使用数据库项的ID,通过填充要检索的属性的数组,告诉它要填充关于它返回的对象的哪些信息。数组中不包含的任何属性都保留为默认值,通常为null 问题是: 我希望用户能够选择一个对象的属性而不是获取该值,只需选择以下属性:C# 使用字符串选择对象属性,c#,oop,C#,Oop,我正在写的一个C程序有点问题,如果有人能帮我,那就太好了 背景是这样的,不是很重要,但这就是为什么我需要找出如何做到这一点: 我正在使用数据库的Web服务来检索有关数据库中某个条目的信息。每次访问数据库都会返回一个具有许多属性的对象。使用数据库项的ID,通过填充要检索的属性的数组,告诉它要填充关于它返回的对象的哪些信息。数组中不包含的任何属性都保留为默认值,通常为null 问题是: 我希望用户能够选择一个对象的属性而不是获取该值,只需选择以下属性: projectFields[0] = Prim
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);
}
}
我同意其他答案,这些答案表明这可能是一个有点可怕的设计…你可能可以通过反射实现你想要的,但我有一种明显的感觉,你的系统设计可能有问题。你可能可以通过反射实现你想要的,但是我有一种明显的感觉,就是你的系统设计可能有问题。你可以使用反射-见类。你可以使用反射-见类。当然是重复的。。。看起来…当然是复制品。。。看。。。