dynamic .ToObject <customclass>()无法按预期工作

时间:2017-08-24 12:58:46

标签: c# json selenium

我有一个.json文件和一个自定义类。

我正在使用此.json文件并将其放入动态变量中,以便我可以在运行时访问文件中的特定点。见下面的代码

private static dynamic elements = null;
public static dynamic Elements { get { return elements; } }

static Settings()
{
    elements = JObject.Parse(Common.GetFile("Elements.json"));
}

在下面的函数中,我使用上面的动态变量来识别较小的&#34;块&#34; .json文件。 [见下文]

public void Login(string pUserName, string pPassword)
{
   dynamic _module = Settings.Elements.Login;

   ElementObject _userName = _module.UserName.ToObject<ElementObject>();
   ElementObject _password = _module.Password.ToObject<ElementObject>();
   ElementObject _loginBTN = _module.LoginButton.ToObject<ElementObject>();

   _userName.OnSendKeys(pUserName);
   _password.OnSendKeys(pPassword);
   _loginBTN.OnClick();
}

问题是,ElementObject.cs有一个构造函数,需要通过.json脚本填充公共属性。但是,当逐步调试时,公共属性在变量声明之后才会被设置。 [见下图]

public class ElementObject
{
    public string ClassName;
    public string CssSelector;
    public string Id;
    public string LinkText;
    public string Name;
    public string PartialLinkText;
    public string TagName;
    public string XPath;

    private int index = 0;
    private string finalName = "";
    private string finalClassName = "";

    public ElementObject()
    {
        var _b = new string[] { nameof(ClassName), nameof(CssSelector), nameof(Id), nameof(LinkText), nameof(Name), nameof(PartialLinkText), nameof(TagName), nameof(XPath) };
        var _a = new string[] { ClassName, CssSelector, Id, LinkText, Name, PartialLinkText, TagName, XPath };

        index = Array.IndexOf(_a, _a.FirstOrDefault(s => !string.IsNullOrEmpty(s)));
        finalName = _a[index];
        finalClassName = _b[index];
    }
}

在下图中,您可以看到我正确获取了json数据。 enter image description here

在下图中,当我们到达构造函数时,没有填充任何值 enter image description here

在下面的图片中,您可以看到在我们离开构造函数后,应用了属性,但构造函数没有看到它已应用。 enter image description here

1 个答案:

答案 0 :(得分:0)

我创造了一个工作,经过调查我想要的东西似乎不起作用。

这是我的工作。 [见下面的代码]。

public ElementObject() { }

public static ElementObject Create(dynamic pSrcObj)
{
    ElementObject obj = pSrcObj.ToObject<ElementObject>();
    obj.Init();
    return obj;
}

public void Init()
{
    var _b = new string[] { nameof(ClassName), nameof(CssSelector), nameof(Id), nameof(LinkText), nameof(Name), nameof(PartialLinkText), nameof(TagName), nameof(XPath) };
    var _a = new string[] { ClassName, CssSelector, Id, LinkText, Name, PartialLinkText, TagName, XPath };

    index = Array.IndexOf(_a, _a.FirstOrDefault(s => !string.IsNullOrEmpty(s)));
    finalName = _a[index];
    finalClassName = _b[index];
}

为了让我现在创建对象,我就像这样创建它;

ElementObject _userName = ElementObject.Create(_module.UserName);