0

キーがクラスのプロパティの名前を表す文字列であり、値がプロパティに割り当てたい値であるディクショナリがあります。Dictionary アイテムが参照しているプロパティを特定しましたが、そのプロパティを実際に設定する方法や、可能なすべてのプロパティを含むばかげた switch ステートメントを使用せずに適切なメソッドを呼び出す方法がわかりません。これを行う効率的な方法はありますか?UserConfiguration クラスを変更したり、拡張したりすることはできません。

これが私がこれまでに持っているものです:

public class Class1
{
    public Dictionary<string, string> PDictionary = new Dictionary<string, string>
        {
            {"UserName", "Steve"},
            {"Location", "Over There Somewhere"},
            {"Color", "Mellow Yellow"},
            {"Password", "ILikeCheese"}
        };

    public void SomeMethod()
    {
        foreach (var prop in PDictionary)
        {
            UserConfiguration.Property property;
            Enum.TryParse(prop.Key, out property);

            //Set appropriate property or call appropriate method...

        }
    }
}

public class UserConfiguration
{
    public enum Property
    {
        UserName,
        Location,
        Color,
        Password
    }

    public string UserName { get; set; }
    public string Location { get; set; }
    public string Color { get; set; }
    public string Password { get; private set; }

    public void SetPassword(string password)
    {
        Password = password;
    }
}

誰か良いアイデアはありますか?

4

2 に答える 2

1

正しいプロパティを設定Class1するパラメーターを持つメソッドがあると仮定すると、このようなリフレクションを使用できます(コンパイル エラーが発生して申し訳ありませんが、現在 VS にアクセスできません)。enum Property

Type tClass ;
Type paramType ;
MethodInfo[] methods ;
ParameterInfo[] params ;
Class1 c1 ;
UserConfiguration.Property property;

Enum.TryParse(prop.Key, out property);

Object []paramValues = {prop.value} ;

tClass = typeof(Class1) ;


c1 = new Class1() ;

bool invoked ;

invoked = false ;

//get all the methods of your Class1
methods = tClass.GetMethods() ;

foreach(MethodInfo mi in methods)
{
    //get the parameters of the current method
    params = mi.GetParameters() ;
    if(params != null)
    {
        foreach(ParameterInfo pi in params)
        {
            paramType = pi.ParameterType ;

            if(paramType = typeof(UserConfiguration.Property))
            {
                //a method that receives a userconfiguration properpty has been found
                //now you can call it
                mi.Invoke(c1, paramValues) ;
                invoked = true ;
                break ;
            }
        }
    }
    if(invoked)
    {
        break;
    }
}

setUserNamesetLocationsetColorなどの名前のメソッドがある場合、次のsetPasswordようなことができます

Type tClass ;
Type paramType ;
MethodInfo[] methods ;
ParameterInfo[] params ;
Class1 c1 ;
UserConfiguration.Property property;

Enum.TryParse(prop.Key, out property);

Object []paramValues = {prop.Value} ;

tClass = typeof(Class1) ;


c1 = new Class1() ;

bool invoked ;

invoked = false ;

//get all the methods of your Class1

methods = tClass.GetMethods() ;
foreach(MethodInfo mi in methods)
{
    if(mi.Name.StartsWith("set" + prop.Key)
    {
        //a method name "set<PropertyName>" has been found
        //now you can call it
        mi.Invoke(c1, paramValues) ;
        break ;
    }
}

Type クラスを見て、どのアプローチが適しているかを判断することをお勧めします

http://msdn.microsoft.com/es-es/library/system.type.aspx

于 2013-09-10T12:21:44.080 に答える