使用反射从静态类获取属性值

时间:2015-01-21 16:57:59

标签: c# reflection xamarin.forms

我有一个用于将用户数据存储到文件的类。它运行良好,但不能轻易放入PCL库。在PCL之外,一切都很好。

该课程看起来像这样

public static class UserData
{
    public static object GetPropertyValue(this object data, string propertyName)
    {
        return data.GetType().GetProperties().Single(pi => pi.Name == propertyName).GetValue(data, null);
    }

    public static object SetPropertyValue<T>(this object data, string propertyName, T value)
    {
        data.GetType().GetProperties().Single(pi => pi.Name == propertyName).SetValue(data, value);
        return new object();
    }

    private static string pUserSettingsFile;
    private static UserSettings userSetting;

    public static bool AccountEnabled
    {
        get
        {
            return UserSettings.account_enabled;
        }

        set
        {
            UserSettings settings = UserSettings;
            settings.account_enabled = value;
            UserSettings = settings;
        }
    }

   public static UserSettings UserSettings
    {
        get
        {
            if (userSetting == null)
            {
                if (File.Exists(UserSettingsFile))
                {
                    userSetting = Serializer.XmlDeserializeObject<UserSettings>(UserSettingsFile);
                }
                else
                {
                    userSetting = new UserSettings();
                    Serializer.XmlSerializeObject(userSetting, UserSettingsFile);
                }
            }

            return userSetting;
        }

        set
        {
            if (value == null)
            {
                throw new ArgumentNullException("value is null!");
            }

            userSetting = value;
            if (File.Exists(UserSettingsFile))
            {
                File.Delete(UserSettingsFile);
            }

            Serializer.XmlSerializeObject(userSetting, UserSettingsFile);
        }
    }

    public static string UserSettingsFile
    {
        get
        {
            if (string.IsNullOrEmpty(pUserSettingsFile))
            {
                pUserSettingsFile = Path.Combine(GroupShootDroid.Singleton.ContentDirectory, "UserSettings.xml");
            }

            return pUserSettingsFile;
        }
    }

    #endregion
}

public class UserSettings
{
    public bool account_enabled { get; set; }

    public string address { get; set; }

    public string country { get; set; }
}

这不是火箭科学,而是我需要做的事情。

我尝试做的是使用Get / SetPropertyValue方法返回或设置类中的任何属性。

目前,要使用此方法访问Get / SetPropertyValue方法

    public string GetStringValue(string valToGet)
    {
        string rv = (string)UserData.GetPropertyValue(valToGet);
        return rv;
    }

    public void SetStringValue(string name, string val)
    {
        UserData.SetPropertyValue(name, val);
    }

在编译时,GetPropertyValue方法会发出错误,No overload for method GetPropertyValue takes 1 argument抱着SetPropertyValue抱怨没有超载需要2

我不确定我使用的代码会做我需要它做的事情(从我在这里读到的应该是这样),但我还有更多对错误显示的原因感到困惑。

有没有更好的方法来做我想做的事情?该应用程序是一个Xam.Forms应用程序,因此PCL通过使用注入的接口访问该类。

2 个答案:

答案 0 :(得分:0)

您正在定义扩展方法,您需要一个类的实例来调用它们:

var o = new Object();
string rv = (string)o.GetPropertyValue(valToGet);
// or, but no sure
string rv = (string)UserData.GetPropertyValue(o, valToGet);

或更多可能在您的情况下:

public string GetStringValue(string valToGet)
{
    string rv = (string)this.GetPropertyValue(this, valToGet);        
    //or
    //string rv = (string)UserData.GetPropertyValue(this, valToGet);        
    return rv;
}

答案 1 :(得分:0)

我认为你在UserData类和对象类之间感到困惑。您的扩展方法扩展了对象。