Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.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
C# foreach语句无法对“object”类型的变量进行操作_C#_Linq_Foreach - Fatal编程技术网

C# foreach语句无法对“object”类型的变量进行操作

C# foreach语句无法对“object”类型的变量进行操作,c#,linq,foreach,C#,Linq,Foreach,我有3个下拉列表,2个源相同,第3个有选定列表。若selected列表不为空,我应该从第一个列表中删除selected,并在第三个列表中绑定。第二个是静态的,显示原始列表 但我不知道如何在一个对象中进行foreach 错误:foreach语句无法对“object”类型的变量进行操作 因为“对象”不包含对象的公共定义 “GetEnumerator” 版本2 public void DataSource(IList source, IList select, string Value = "

我有3个下拉列表,2个源相同,第3个有选定列表。若selected列表不为空,我应该从第一个列表中删除selected,并在第三个列表中绑定。第二个是静态的,显示原始列表

但我不知道如何在一个对象中进行foreach

错误:foreach语句无法对“object”类型的变量进行操作 因为“对象”不包含对象的公共定义 “GetEnumerator”

版本2

    public void DataSource(IList source, IList select, string Value = "UId", string Text = "Text")
    {
        ddlThis.DataSource = source;
        ddlThis.DataTextField = Text;
        ddlThis.DataValueField = Value;
        ddlThis.DataBind();

        ddlThisHidden.DataSource = source;
        ddlThisHidden.DataTextField = Text;
        ddlThisHidden.DataValueField = Value;
        ddlThisHidden.DataBind();

        if (select != null)
        {
            ddlOther.DataSource = source.Cast<object>()
                .Select(x => select.Cast<object>().Any(c=> c.GetType().GetProperty(Value).GetValue(source, null).ToString() == x.GetType().GetProperty(Value).GetValue(source, null).ToString()));
            ddlOther.DataTextField = Text;
            ddlOther.DataValueField = Value;
            ddlOther.DataBind();

            foreach (var item in select)
                ddlThis.Items.Remove(item.ToString());
        }
    }
版本3正在运行


修改代码以检查IEnumerable接口。它有一种感觉,那就是你想要的更多

public void DataSource(object source, object select, string Value = "UId", string Text = "Text")
{
    ddlThis.DataSource = source;
    ddlThis.DataTextField = Text;
    ddlThis.DataValueField = Value;
    ddlThis.DataBind();

    ddlThisHidden.DataSource = source;
    ddlThisHidden.DataTextField = Text;
    ddlThisHidden.DataValueField = Value;
    ddlThisHidden.DataBind();

    if (select != null)
    {
        ddlOther.DataSource = select;
        ddlOther.DataTextField = Text;
        ddlOther.DataValueField = Value;
        ddlOther.DataBind();

        if (select is IEnumerable) //check if the object is a list of objects
            foreach (var item in (IEnumerable)ddlOther.DataSource)
                ddlThis.Items.Remove(item);
        else //try to remove the single object
            ddlThis.Items.Remove(select)
    }
}

如果您不知道对象的确切类型,但可以肯定的是,不管它是什么,它都会有GetEnumerator,比如说,因为它是一个集合或实现IEnumerable的您自己的对象之一,您可以通过强制转换为dynamic来阻止编译器发出错误,如下所示:

foreach (var item in (dynamic)(ddlOther.DataSource)) {
    ...
}

这里的技巧是,如果发现ddlOther.DataSource没有GetEnumerator,那么您将在运行时得到一个错误,而不是编译时错误。

您不能。对象本身的派生类型多于System。对象必须实现IEnumerable才能通过它。在我看来,ddlOther.DataSource的类型似乎是system.object。为什么源是对象?这就是问题所在。DataSource是一个对象,我想你应该在ddlOther.items上迭代。我很好奇为什么你要声明作为对象传递的值,而不是一个特定的IList对象。好的,我正在将对象更改为IList,我想应该可以。我更改为IList,但现在得到的对象与目标类型不匹配。在ddlOther.datasource中,由于试图在对象上foreach的代码仍然存在,因此无法修复编译错误。忘记了强制转换。。。sry。。。editedyes动态解决了我的问题!我有最后一个小问题ddlOther.DataSource=IEnumerablesource.Cast.ToList.FindAllx=>IEnumerableselect.Cast.Anyc=>c.UId==x.UId;在这段代码中,我手动提供了UId,但我想动态地提供属性名,我可以这样做吗?类似于.Anyc=>c[Value]==x[Value];你可以在第三版中查到这个问题。更容易阅读。@Mert不幸的是,仅使用dynamic无法将属性名作为字符串传递。你需要制作一个通过反射或Linq.Expressions的方法来实现这一点。是的,我就是用反射来实现的!非常感谢你
public void DataSource(object source, object select, string Value = "UId", string Text = "Text")
{
    ddlThis.DataSource = source;
    ddlThis.DataTextField = Text;
    ddlThis.DataValueField = Value;
    ddlThis.DataBind();

    ddlThisHidden.DataSource = source;
    ddlThisHidden.DataTextField = Text;
    ddlThisHidden.DataValueField = Value;
    ddlThisHidden.DataBind();

    if (select != null)
    {
        ddlOther.DataSource = select;
        ddlOther.DataTextField = Text;
        ddlOther.DataValueField = Value;
        ddlOther.DataBind();

        if (select is IEnumerable) //check if the object is a list of objects
            foreach (var item in (IEnumerable)ddlOther.DataSource)
                ddlThis.Items.Remove(item);
        else //try to remove the single object
            ddlThis.Items.Remove(select)
    }
}
foreach (var item in (dynamic)(ddlOther.DataSource)) {
    ...
}