繁体   English   中英

动态.ToObject <CustomClass> ()无法正常工作

[英]dynamic .ToObject<CustomClass>() not working as expected

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

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

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

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

在下面的函数中,我使用上面的动态变量来标识.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数据。 在此处输入图片说明

在下面的图片中,当我们到达构造函数时,没有一个值被填充 在此处输入图片说明

在下图中,您可以看到在退出构造函数后,属性已应用,但构造函数未看到其应用。 在此处输入图片说明

经过研究,我创建了一个解决方案,但我想要的似乎不起作用。

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

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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM