Programing

문자열 이름으로 클래스 속성 설정 / 가져 오기

lottogame 2020. 11. 12. 07:43
반응형

문자열 이름으로 클래스 속성 설정 / 가져 오기


이 질문에 이미 답변이 있습니다.

내가하려는 것은 문자열을 사용하여 클래스의 속성 값을 설정하는 것입니다. 예를 들어 내 클래스에는 다음과 같은 속성이 있습니다.

myClass.Name
myClass.Address
myClass.PhoneNumber
myClass.FaxNumber

모든 필드는 string유형이므로 항상 문자열이라는 것을 미리 알고 있습니다. 이제 DataSet객체 로 할 수있는 것처럼 문자열을 사용하여 속성을 설정할 수 있기를 원합니다 . 이 같은:

myClass["Name"] = "John"
myClass["Address"] = "1112 River St., Boulder, CO"

이상적으로는 변수를 할당 한 다음 변수에서 해당 문자열 이름을 사용하여 속성을 설정하고 싶습니다.

string propName = "Name"
myClass[propName] = "John"

나는 성찰에 대해 읽고 있었고 아마도 그것을하는 방법 일 수도 있지만 클래스에서 속성 액세스를 그대로 유지하면서 어떻게 설정하는지 잘 모르겠습니다. 다음을 계속 사용할 수 있기를 원합니다.

myClass.Name = "John"

모든 코드 예제는 정말 훌륭합니다.


인덱서 속성 인 의사 코드를 추가 할 수 있습니다 .

public class MyClass 
{
     public object this[string propertyName] 
     {
        get{
           // probably faster without reflection:
           // like:  return Properties.Settings.Default.PropertyValues[propertyName] 
           // instead of the following
           Type myType = typeof(MyClass);                   
           PropertyInfo myPropInfo = myType.GetProperty(propertyName);
           return myPropInfo.GetValue(this, null);
        }
        set{
           Type myType = typeof(MyClass);                   
           PropertyInfo myPropInfo = myType.GetProperty(propertyName);
           myPropInfo.SetValue(this, value, null);

        }

     }
}

클래스에 인덱서를 추가하고 리플렉션을 사용하여 속성을 에이스 할 수 있습니다.

using System.Reflection;

public class MyClass {

    public object this[string name]
    {
        get
        {
            var properties = typeof(MyClass)
                    .GetProperties(BindingFlags.Public | BindingFlags.Instance);

            foreach (var property in properties)
            {
                if (property.Name == name && property.CanRead)
                    return property.GetValue(this, null);
            }

            throw new ArgumentException("Can't find property");

        }
        set {
            return;
        }
    }
}

이와 같은 것일 수 있습니까?

    public class PropertyExample
{
    private readonly Dictionary<string, string> _properties;

    public string FirstName
    {
        get { return _properties["FirstName"]; }
        set { _properties["FirstName"] = value; }
    }

    public string LastName
    {
        get { return _properties["LastName"]; }
        set { _properties["LastName"] = value; }
    }
    public string this[string propertyName]
    {
        get { return _properties[propertyName]; }
        set { _properties[propertyName] = value; }
    }

    public PropertyExample()
    {
        _properties = new Dictionary<string, string>();
    }
}

참고 URL : https://stackoverflow.com/questions/10283206/setting-getting-the-class-properties-by-string-name

반응형