public IEnumerator DoGetData_Single_Coroutine <T>(string strKey, OnFinish_FirebaseDB_GetValue_Single <T> OnFinishGetData)
        where T : IFirebaseData
    {
        var pTask = DoGetData_Single <T>(strKey, OnFinishGetData);

        while (pTask.IsCompleted == false)
        {
            yield return(null);
        }
    }
    public Task DoGetData_Single(System.Type pType, string strKey, OnFinish_FirebaseDB_GetValue_Single OnFinishGetData)
    {
        string strRootNodeName = GetRootNodeName(pType);

        return(FirebaseDatabase.DefaultInstance.RootReference.Child(strRootNodeName).
               Child(strKey).
               GetValueAsync().
               ContinueWith(task =>
        {
            string strJsonResult = task.Result.GetRawJsonValue();
            if (task.IsFaulted || string.IsNullOrEmpty(strJsonResult))
            {
                OnFinishGetData?.Invoke(false, strJsonResult);
            }
            else if (task.IsCompleted)
            {
                OnFinishGetData?.Invoke(true, strJsonResult);
            }
        }));
    }
    public Task DoGetData_Single <T>(string strKey, OnFinish_FirebaseDB_GetValue_Single <T> OnFinishGetData)
        where T : IFirebaseData
    {
        string strRootNodeName = GetRootNodeName(typeof(T));

        return(FirebaseDatabase.DefaultInstance.RootReference.Child(strRootNodeName).
               Child(strKey).
               GetValueAsync().
               ContinueWith(task =>
        {
            string strJsonResult = task.Result.GetRawJsonValue();
            if (task.IsFaulted || string.IsNullOrEmpty(strJsonResult))
            {
                OnFinishGetData?.Invoke(false, strJsonResult, default(T));
            }
            else if (task.IsCompleted)
            {
                T pData = JsonConvert.DeserializeObject <T>(strJsonResult);
                pData.IFirebaseData_strDBKey = strKey;
                OnFinishGetData?.Invoke(true, strJsonResult, pData);
            }
        }));
    }