Javascript 实现从对象字段和字段值生成字符串的C#代码
我有一个用Javascript编写的代码,我想把它转换成C。代码所做的是获取一个javascript对象,然后使用对象中的键值对创建一个字符串。在C#中,您将如何执行类似的操作 下面是javascript代码Javascript 实现从对象字段和字段值生成字符串的C#代码,javascript,c#,.net,object,Javascript,C#,.net,Object,我有一个用Javascript编写的代码,我想把它转换成C。代码所做的是获取一个javascript对象,然后使用对象中的键值对创建一个字符串。在C#中,您将如何执行类似的操作 下面是javascript代码 const userSession = { application_id: 1111, auth_key: "abc123456, nonce: a456654, times
const userSession = {
application_id: 1111,
auth_key: "abc123456,
nonce: a456654,
timestamp: 1254564,
user: {
login : "johnwick",
password: 123434543
}
}
signParams(userSession) {
if (typeof userSession != 'object') {
throw Error('not an object');
}
let signature = Object.keys(userSession)
.map(elem => {
if (typeof userSession[elem] === 'object') {
return Object.keys(userSession[elem])
.map(elem1 => {
return elem + '[' + elem1 + ']=' + userSession[elem][elem1];
})
.sort()
.join('&')
}
else {
return elem + '=' + userSession[elem]
}
})
.sort()
.join('&')
return this.hmacSha1(signature);
}
signParams(userSession)
字符串应该是这样的
“应用程序\u id=3610&auth\u key=aDRceQyTXSYEdJU&nonce=a456654×tamp=${timestamp}&user[login]=johnwick&user[password]=123434543”
下面是我如何使用c对象初始化c中的对象,因为c中没有类似于Javascript对象的对象
public class UserSession
{
public int ApplicationId { get; set; }
public string AuthKey { get; set; }
public double Nonce { get; set; }
public double Timestamp { get; set; }
public string Signature { get; set; }
public dynamic User { get; set; }
}
public async Task<Session> GenerateSessionParams(User user)
{
string filename = "config.json";
using FileStream openStream = File.OpenRead(filename);
Config config = await JsonSerializer.DeserializeAsync<Config>(openStream);
Session session = new Session();
session.ApplicationId = config.cred.appId;
session.AuthKey = config.cred.authKey;
session.Nonce = this.RandomNonce();
session.Timestamp = this.GetTimeStamp();
if (user.Login != default && user.Password != default)
{
session.User = new { Login = user.Login, Password = user.Password };
}
else if (user.Email != default && user.Password != default)
{
session.User = new { Email = user.Email, Password = user.Password };
}
return session;
}
公共类用户会话
{
public int ApplicationId{get;set;}
公共字符串AuthKey{get;set;}
公共双时态{get;set;}
公共双时间戳{get;set;}
公共字符串签名{get;set;}
公共动态用户{get;set;}
}
公共异步任务GenerateSessionParams(用户)
{
字符串filename=“config.json”;
使用FileStream openStream=File.OpenRead(文件名);
Config=await JsonSerializer.DeserializeAsync(openStream);
会话=新会话();
session.ApplicationId=config.cred.appId;
session.AuthKey=config.cred.AuthKey;
session.Nonce=this.RandomNonce();
session.Timestamp=this.GetTimeStamp();
if(user.Login!=默认值&&user.Password!=默认值)
{
session.User=new{Login=User.Login,Password=User.Password};
}
else if(user.Email!=默认值&user.Password!=默认值)
{
session.User=new{Email=User.Email,Password=User.Password};
}
返回会议;
}
我认为您要做的是将对象转换为查询字符串
我认为c#没有任何内置函数可以实现这一点,您需要编写自己的函数来实现这一点
尝试在运行时使用反射获取属性名及其值,并将它们转换为查询字符串格式的字符串
下面是一篇关于如何做到这一点的文章
我从文章中提取了代码片段,并根据您的需要做了一些更改
static string ConvertToQueryString(UserSession session)
{
var properties = session.GetType().GetProperties()
.Where(x => x.CanRead)
.Where(x => x.GetValue(session,null) != null)
.ToDictionary(x=>x.Name, x=>x.GetValue(session,null));
var propertyNames = properties
.Where(x => !(x.Value is string) && x.Value is IEnumerable)
.Select(x => x.Key)
.ToList();
foreach (var key in propertyNames)
{
var valueType = properties[key].GetType();
var valueElemType = valueType.IsGenericType
? valueType.GetGenericArguments()[0]
: valueType.GetElementType();
if (valueElemType.IsPrimitive || valueElemType == typeof (string))
{
var enumerable = properties[key] as IEnumerable;
properties[key] = string.Join("&", enumerable.Cast<object>());
}
}
return string.Join("&", properties
.Select(x => string.Concat(
Uri.EscapeDataString(x.Key), "=",
Uri.EscapeDataString(x.Value.ToString()))));
}
}
静态字符串ConvertToQueryString(用户会话)
{
var properties=session.GetType().GetProperties()
.其中(x=>x.CanRead)
.Where(x=>x.GetValue(会话,null)!=null)
.ToDictionary(x=>x.Name,x=>x.GetValue(session,null));
var propertyNames=属性
其中(x=>!(x.Value是字符串)和&x.Value是IEnumerable)
.选择(x=>x.Key)
.ToList();
foreach(propertyNames中的var键)
{
var valueType=properties[key].GetType();
var valuelemtype=valueType.IsGenericType
?valueType.GetGenericArguments()[0]
:valueType.GetElementType();
if(valueElemType.IsPrimitive | | valueElemType==类型(字符串))
{
var enumerable=属性[键]为IEnumerable;
properties[key]=string.Join(“&”,enumerable.Cast());
}
}
返回字符串。Join(&),属性
.Select(x=>string.Concat(
Uri.EscapeDataString(x.Key),“=”,
EscapeDataString(x.Value.ToString());
}
}
注意:与文章中一样,如果要链接此函数,最好创建一个扩展方法
阅读更多关于扩展函数的信息:为什么不能使用Newtonsoft来处理JSON?我对c#生态系统不熟悉,所以对它了解不多。我猜您的意思是使用C#中的Newtonsoft将javascript对象转换为JSON,而不是创建C#类?请参见: