Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/390.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 实现从对象字段和字段值生成字符串的C#代码_Javascript_C#_.net_Object - Fatal编程技术网

Javascript 实现从对象字段和字段值生成字符串的C#代码

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

我有一个用Javascript编写的代码,我想把它转换成C。代码所做的是获取一个javascript对象,然后使用对象中的键值对创建一个字符串。在C#中,您将如何执行类似的操作

下面是javascript代码

     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#类?请参见: