问题 如何将对象投射到列表<int>

假套索

成员
已加入
2019年9月19日
留言内容
10
编程经验
Beginner
嘿大家,

我有一个API可以转换我的列表<int>放入一个对象,以便可以通过网络发送它。当我在接收端收到它时,我正在尝试将其转换回列表<int>但我不知道该怎么做。

当我打印object.ToString()时,我看到以下内容:
C#:
System.Collections.Generic.List`1[System.Object]

任何有关如何正确执行此操作的帮助或指导,将不胜感激!

C#:
class Identity
{
    private static List<int> _characterlist = new List<int>();

    public static List<int> CharacterList
    {
        get { return _characterlist; }
        protected set { _characterlist = value; }
    }

    private void identitySync(ExpandoObject id)
    {
        _characterlist.Clear();

        Identity player = new Identity();
        foreach (var v in id)
        {
            if (v.Value is IList && v.Value.GetType().IsGenericType)
            {
                // This is where I need to convert to the list
                Console.WriteLine($"{v.Value.ToString()}");
                _characterlist = new List<int>(v.Value);
            }
            else
            {
                PropertyInfo pInfo = player.GetType().GetProperty(v.Key);
                pInfo.SetValue(player, Convert.ChangeType(v.Value, pInfo.PropertyType), null);
            }
        }
    }
}
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,566
地点
悉尼,澳大利亚
编程经验
10+
If what you actually have is a List<object> where each item is a boxed 整型 then you're not actually casting that top-level object. You have to create a new List<int> and cast each item in the old list before adding it. There are various ways to do that but, if the reference you have is type IList, this is probably the easiest way:
C#:
_characterList = v.Value.Cast<int>().ToList();
等效的长期代码如下:
C#:
_characterList = new List<int>();

foreach (var n in v.Value)
{
    _characterList.Add((int)n);
}
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,566
地点
悉尼,澳大利亚
编程经验
10+
Is there a possibility that more than one item in id will match the condition in your if statement? If so, you're only going to get the last set of data in _characterList.
 

假套索

成员
已加入
2019年9月19日
留言内容
10
编程经验
Beginner
If what you actually have is a List<object> where each item is a boxed 整型 then you're not actually casting that top-level object. You have to create a new List<int> and cast each item in the old list before adding it. There are various ways to do that but, if the reference you have is type IList, this is probably the easiest way:
C#:
_characterList = v.Value.Cast<int>().ToList();
等效的长期代码如下:
C#:
_characterList = new List<int>();

foreach (var n in v.Value)
{
    _characterList.Add((int)n);
}

嘿,谢谢你的帮助!

不幸的是,这没有用。 Visual Studio引发错误:"foreach语句无法对类型为“对象”的变量进行操作,因为“对象”不包含“ GetEnumerator”的公共实例定义"我不明白为什么它实际上在if ..中匹配该条件,如果它实际上只是一个对象,但是
 

假套索

成员
已加入
2019年9月19日
留言内容
10
编程经验
Beginner
我弄清楚了,我只需要将对象强制转换为动态对象即可。谢谢您的帮助!!!

C#:
foreach (var n in (dynamic)v.Value)
{
    _characterList.Add((int)n);
}
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,566
地点
悉尼,澳大利亚
编程经验
10+
我没有足够仔细地阅读您的其余代码。我实际上将其更改为:
C#:
foreach (var v in id)
{
    var value = v.Value as Ilist;
    
    if (value != null && value.GetType().IsGenericType)
    {
        _characterlist = value.Cast<int>().ToList();
    }
    else
    {
        PropertyInfo pInfo = player.GetType().GetProperty(v.Key);
        pInfo.SetValue(player, Convert.ChangeType(v.Value, pInfo.PropertyType), null);
    }
}
 

假套索

成员
已加入
2019年9月19日
留言内容
10
编程经验
Beginner
问题在于对象“ id”中的所有东西都不一定是列表。我从这里的代码中删除了所有不相关的属性。我在其他方面都使用了Reflections。反思只是让我对清单感到失望...
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,566
地点
悉尼,澳大利亚
编程经验
10+
问题在于对象“ id”中的所有东西都不一定是列表。
No, that isn't a problem. The as keyword is a conditional cast. This line:
C#:
var value = v.Value as IList;
will result in value referring to an object that implements the IList interface if v.Value refers to one and, otherwise, it will result in value being null, hence the following if statement.
 

跳伞者

工作人员
已加入
2019年4月6日
留言内容
2,605
地点
弗吉尼亚州切萨皮克
编程经验
10+
如果您使用C#7.0 模式匹配...
C#:
foreach (var v in id)
{
    if (v.Value is IList value && value.GetType().IsGenericType)
    {
        _characterlist = value.Cast<int>().ToList();
    }
    else
    {
        PropertyInfo pInfo = player.GetType().GetProperty(v.Key);
        pInfo.SetValue(player, Convert.ChangeType(v.Value, pInfo.PropertyType), null);
    }
}
 
最佳 底部