2009-07-30 4 views
-5

액세스하려는 변수의 이름 만 가지고 있으면 개체의 변수 값에 어떻게 액세스합니까? C#.C# 액세스 필드 구문

변수 이름이 배열에 문자열로 표시되어 있다고 가정 해 봅시다. 루프에 어떻게 액세스합니까? 나는 액션 스크립트에서 다음과 같이 수행 할 수 있습니다

var arrayOfVariableNames:Array = ["name", "age", "sex"] 

for each(var person:Person in persons) 
{ 
    if (person[age] > 29) //what is equivalent in c# for object[field] 
    { 
     //do something 
    } 
} 
+0

Java로 할 수 있습니까?!? – Jimmy

+0

코드에 루프가 없거나 선언 한 배열을 사용합니까? 당신이 묻고 자하는 것이 무엇인지는 매우 분명하지 않습니다. –

+0

네가 맞다. 나는 액션 스크립트를 의미했다. – Chin

답변

2

당신은 그것의 이름으로 필드를 액세스하기 위해 반사를 사용할 수 있습니다 내가 제대로 질문을 이해하면

FieldInfo ageField = typeof(Person).GetField("age"); 
int age = (int) field.GetValue(person); 
1

변수의 목록에있는 모든 변수를 얻을 수있는 유일한 방법은 물체에 반사입니다,하지만를, 당신은 유형 객체의 값의 그룹으로 끝낼 것 실제로 거기에 포함 된 유형을 알 수있는 방법이 없습니다 (예 : Name [string], Age [int] 및 Weight [int]에 대해 object 유형의 변수로 끝남). 이렇게하면 리플렉션이 객체에서 값 집합을 가져 오는 잘못된 방법이됩니다.

그러나, 필드에 액세스 할 수있는 일반 구문은 다음과 같이 object.value입니다 : Console.WriteLine의 사용은 거의 C와에서의 printf/fprintf와를 사용하는 것과 같습니다

Person p = new Person ("John", 25, 160); // Name, age, weight (lbs) 
Console.WriteLine ("Hello {0}!", p.Name); // Output: "Hello John!" 

하는 것으로 그 ilk.

1

것은,이 같은 것을 할 수 있습니다 : 그것은 당신의 문제를 해결할 것

class Person { 
    private int age; 
    private string name; 
    private string sex; 

    public object this[string name] 
    { 
     get 
     { 
     PropertyInfo property = GetType().GetField(name); 
     return property.GetValue(this, null); 
     } 
     set 
     { 
     PropertyInfo property = GetType().GetField(name); 
     property.SetValue(this, value, null); 
     } 
    } 
} 

을, 내 견해가 중요하다면, 타입 안전성을 잃어 버리기 때문에 정상적인 속성을 사용해야합니다.

+0

문제 해결을 위해 +1, 순 투표 수가 0 인 슬픈 API를 구현하기 위해 -1 (물론 오류가 아님). –