强制转换和类型转换(C# )
类型转换微软官方文档
官方文档:https://docs.microsoft.com/zh-cn/dotnet/csharp/programming-guide/types/casting-and-type-conversions
强制转换在方法带有object参数中使用
在方法中带有 object 参数时 可以放任何 【类型】,在使用中可以对应的强制转换
相关代码:
using System.Text;
using System.Threading.Tasks;
namespace Test
{
class Program
{
//入口
static void Main(string[] args)
{
List<PlayerData> datas = new List<PlayerData>();
datas.Add(new PlayerData("冬奥会"));
datas.Add(new PlayerData("冰墩墩"));
OpenInfo(datas);
Console.ReadKey();
}
static void OpenInfo(object userdata)
{
foreach (var item in (List<PlayerData>)userdata)
{
Console.WriteLine(item.Petname);
}
}
}
}
namespace Test
{
class PlayerData
{
string petname;
int age;
string state;
public PlayerData(string name)
{
Petname = name;
}
public string Petname { get => petname; set => petname = value; }
}
}
实际的应用
应用场景:他的派生类,每一个请求对应着每一个回应数据。返回的数据类型可已经在相应中使用
using RRQMProxy;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public abstract class BaseRequest
{
/// <summary>
/// 发送请求信息
/// </summary>
public abstract void SendRequest();
/// <summary>
///响应请求信息
/// </summary>
/// <param name="data"></param>
public abstract void OnResponse(RespondResult respondResult,object data);
}
在不知道这种方法之前,你需要再写一个单独的相应方法来处理
或者使用反射来处理相应
但是 ,现在你只需要用 GameUserData userData=(GameUserData)data;进行强制转换后,在进行处理相应逻辑
using HungryStrangerClient;
using RRQMProxy;
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class LoginRequest : BaseRequest
{
/// <summary>
/// 发送登录的消息
/// </summary>
/// <param name="account"></param>
/// <param name="password"></param>
public void SendRequest(string account, string password)
{
GameUserData gameUserData;
RespondResult respondResult = RRQMMethodServerHelper.LoginMethodMessage.Login(account, password, out gameUserData);
OnResponse(respondResult, gameUserData);
}
public void OnResponse(RespondResult respondResult, GameUserData data)
{
//登录成功
if (respondResult.mResult)
{
//登录是成后,玩家应该返回我玩家的信息
//存储用户信息
PlayerPrefsExtension.SetObject<GameUserData>("GameUser", data);
//创建玩家消息
GamePlayerData gamePlayerData = new GamePlayerData()
{
PetPhrase = data.PetPhrase,
PlayerName = data.PlayerName,
playerState = PlayerState.空闲中
};
PlayerPrefsExtension.SetObject<GamePlayerData>("GamePlayer", gamePlayerData);
Debug.Log("登录成功" + respondResult.mResult + "原因为:" + respondResult.mMessage);
GameEntry.UI.OpenUIForm(UIFormId.InfoForm, data);
}
else
{
DialogParams dialogParams = new DialogParams()
{
Title = "登录提示",
Message = respondResult.mMessage,
Mode = 1,
ConfirmText = "重新输入",
OnClickConfirm = delegate (object userdata)
{
GameEntry.UI.OpenUIForm(UIFormId.LoginForm);
},
};
GameEntry.UI.OpenDialog(dialogParams);
Debug.Log("登录失败" + respondResult.mResult + "原因为:" + respondResult.mMessage);
}
}
public override void SendRequest()
{
}
//public override void OnResponse(RespondResult respondResult, object data)
//{
// //登录成功
// if (respondResult.mResult)
// {
// Debug.LogWarning("获取的类型" + data.GetType());
// Debug.LogWarning("typeof之后的类型获取到的属性" + typeof(GameUserData).GetProperty("Account").GetValue(data));
// PlayerPrefs.SetString("Account", typeof(GameUserData).GetProperty("Account").GetValue(data).ToString());
// PlayerPrefs.SetString("Pet", typeof(GameUserData).GetProperty("PetPhrase").GetValue(data).ToString());
// Debug.Log("登录成功" + respondResult.mResult + "原因为:" + respondResult.mMessage);
// GameEntry.UI.OpenUIForm(UIFormId.InfoForm);
// }
// else
// {
// Debug.Log("登录失败" + respondResult.mResult + "原因为:" + respondResult.mMessage);
// }
//}
//不需要再使用反射 在进行处理了
public override void OnResponse(RespondResult respondResult, object data)
{
//登录成功
if (respondResult.mResult)
{
GameUserData userData = (GameUserData)data;
PlayerPrefs.SetString("Account", userData.Account);
PlayerPrefs.SetString("Pet", userData.PetPhrase);
Debug.Log("登录成功" + respondResult.mResult + "原因为:" + respondResult.mMessage);
GameEntry.UI.OpenUIForm(UIFormId.InfoForm);
}
else
{
Debug.Log("登录失败" + respondResult.mResult + "原因为:" + respondResult.mMessage);
}
}
}