2009-06-23 6 views
1

내가 쓰고있는 C# 프로그램에 약간의 문제가있어 누군가 도움이된다면 좋을 것입니다.문자열을 사용하여 개체 속성 선택

배경은, 정말 중요하지이,하지만 난 그것을 할 방법을 강구해야 할 이유는 다음과 같습니다 나는 데이터베이스의 항목에 대한 정보를 검색 할 데이터베이스의 웹 서비스를 사용하고

. 데이터베이스에 액세스 할 때마다 속성이 많은 Object가 반환됩니다. 데이터베이스 항목의 ID를 사용하여 검색 할 속성의 배열을 채워서 반환하는 객체에 대해 채울 정보를 지정합니다. 이 (보통 NULL) 기본값이다로하지 배열의 모든 속성은 남아

문제점 : 나는 사용자가로 (값을 얻을뿐만 아니라 어떤 속성을 선택) 객체의 속성을 선택 할 수 있도록하려면 아래 : project_properties.Text 내가 projectFields [0]로 설정하려는 속성의 이름의 문자열입니다

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

.

아무도 도와 줄 수 있습니까? 미리 감사드립니다 :)

편집 : 답변 녀석 들께 감사드립니다. 그들은 객체의 가치를 동적으로 얻도록 해 주지만, 그것은 내가 찾고있는 것이 아닙니다 ... 값을 검색하지 않으려 고합니다. projectFields [0] 속성 만 설정하려고합니다. 평등하다. 예를 들어 사용자가 Id를 프로젝트에 대해 반환 할 정보로 선택했다고 가정합니다. 이를 위해 다음을 설정했습니다.

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

그런 다음 데이터베이스에 대한 호출을하고 다른 모든 속성이 기본값으로 유지되는 동안 프로젝트에 대해 ID가 채워진 프로젝트 Object를 다시 가져옵니다. 기본적으로, 내가이 예제들이 제안한 방식대로한다면, 먼저 객체의 모든 속성을 가져와야한다. 그런 다음 사용자가 관심있는 멤버에게 액세스한다. 느린/비효율적 인 멤버가된다. 그 일을하려고하는 m.

데이터베이스에 액세스하는 방법이 이상하다는 것을 알고 있지만 웹 서비스를 사용하고 있으므로 데이터베이스 호출에 대해 아무것도 변경할 수있는 옵션이 없습니다.

+0

확실히 중복 ... 찾고 있습니다 ... –

답변

4

당신은 아마 당신이 반사 (example)를 통해 원하는 것을 달성 할 수있는, 하지만 당신 시스템의 디자인에 문제가있을 수 있다는 뚜렷한 느낌이 들게됩니다.

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

    } 
} 

...

0

리플렉션을 사용할 수 있습니다 - property info 클래스를 참조하십시오.