Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.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#属性中作为IEnumerable<&燃气轮机;数据源覆盖中的泛型_C#_.net_Generics_Data Binding - Fatal编程技术网

铸造;“价值”;在C#属性中作为IEnumerable<&燃气轮机;数据源覆盖中的泛型

铸造;“价值”;在C#属性中作为IEnumerable<&燃气轮机;数据源覆盖中的泛型,c#,.net,generics,data-binding,C#,.net,Generics,Data Binding,以下是您的基本数据源覆盖: public override object DataSource { get { return base.DataSource; } set { base.DataSource = value; } } 我想在setter方法中做的是将值转换为IEnumerable,并对其进行一些操作(如果无

以下是您的基本数据源覆盖:

    public override object DataSource
    {
        get
        {
            return base.DataSource;
        }
        set
        {   
            base.DataSource = value;
        }
    }

我想在setter方法中做的是将值转换为IEnumerable,并对其进行一些操作(如果无法转换为IEnumerable,则抛出异常),然后将其传递到base.DataSource。如果您能帮上忙,我们将不胜感激。

您没有提到.net版本,但linq提供了一个AsEnumerable()方法,可以满足您的需要

使用值应为.AsEnumerable()


请参见

您可以通过简单的类型转换解决问题,如以下几个示例所示。请注意,您应该谨慎地输入任何IEnumerable,因为某些可枚举类没有迭代后备份的概念。列表和数组会对您很好,但其他一些列表和数组在每次迭代中都会传递一个无返回点

public override object DataSource
{
    get { return base.DataSource; }
    set
    {   
        // Throws an exception if the cast won't work.
        var genenum = (IEnumerable<string>)value;

        // Non-generic enumerable collection, if generic is not necessary.
        // Still throws an exception if the cast is invalid.
        var nongenenum = (IEnumerable)value;

        // Alternatively, you can use a defensive type cast, and manually
        // throw an exception if the result is null or not able to be casted.
        var safeenum = value as IEnumerable<string>;
        if(safeenum == null) throw new ArgumentException();

        // or...
        if(!(value is IEnumerable<string>)) throw new ArgumentException();

        // ... Do stuff with the enumerable.

        base.DataSource = value;
    }
}
公共覆盖对象数据源
{
获取{return base.DataSource;}
设置
{   
//如果强制转换无效,则引发异常。
var genenum=(IEnumerable)值;
//非泛型可枚举集合(如果不需要泛型)。
//如果强制转换无效,仍会引发异常。
var nongenenum=(IEnumerable)值;
//或者,您可以使用防御类型强制转换,并手动
//如果结果为null或无法强制转换,则引发异常。
var safeenum=作为IEnumerable的值;
如果(safeenum==null)抛出新ArgumentException();
//或者。。。
如果(!(值为IEnumerable))抛出新的ArgumentException();
//…处理可枚举的内容。
base.DataSource=值;
}
}
公共覆盖对象数据源
{
得到
{
返回base.DataSource;
}
设置
{   
如果(!(值为IEnumerable))
抛出新的InvalidOperationException(…);//或ArgumentException
base.DataSource=(IEnumerable)值;
}
}
或者也许

    set
    {
        // Includes IEnumerable<T> for any T
        if (!(value is IEnumerable))
            throw new InvalidOperationException(...); // or ArgumentException

        // Do some processing on it, for example cast to your type?
        base.DataSource = ((IEnumerable) value).Cast<MyType>();
    }
set
{
//包括任何T的IEnumerable
如果(!(值为IEnumerable))
抛出新的InvalidOperationException(…);//或ArgumentException
//对它进行一些处理,例如转换为您的类型?
base.DataSource=((IEnumerable)值).Cast();
}

不,这不是我的数据源覆盖,我不认识:-)感谢您的快速响应。我从所有的书中学到了很多。我把我需要/想要的解释得很糟糕。对不起,我是个新手。首先,我使用的是.NET 3.5版Visual Studio 2008 Professional。我的任务是创建一个自定义控件,无论出于何种目的,它都是一个ListView,它有两个额外的属性,用于设置将显示的最大行数。(如果你在想“你不会在数据层设置它吗”,嘿,这是他们的一角钱。那些想要在表示层设置最大值的能力也一样。)因此,我想我会以某种方式覆盖DataSource属性,可能在那里调用Take,但我不知道“value”是什么类型。这就是计划。你们看起来都很聪明,也许有更好的方法。。。或者我忽略的ListView的某个方面已经做到了这一点。如果您想要的是更接近分页的内容,请先显示前10个,然后显示下10个,依此类推。可以考虑查看ASP.NET的GRIDVIEW和其他已经内置的分页控件。如果你只是想要第一个这么多,那么集合中的元素是什么类型并不重要,只要抓住你想要使用的元素就行了。让我来详细介绍一下。我正在重写ListView控件,以便您可以限制显示的行数。同样,您可能会认为您只是在数据层或业务层中这样做,以首先获得集合,但他们不希望这样做。它必须是控件本身的属性。我想使用类型a=value.GetType();IEnumerable=(IEnumerable)值;或者类似的东西,但可能有更好的方法。不过,我想我可能对你的第二个例子有所了解。谢谢。我想大概的意思是我不知道该用什么类型的泛型。我想在运行时确定它。类似的东西类型a=value.GetType();IEnumerable集合=(IEnumerable)值;但由于一些原因,这是行不通的。我解释得很糟糕。目标是限制ListView子类的数据源大小。@Krusaide:您可以这样做。尝试一下(当然使用System.Linq):
var enumerable=((IEnumerable)value.Cast().Take(maximumCount)。当然,将语句展开几行,这样就可以对强制转换执行适当的空检查或异常处理。祝你好运
    set
    {
        // Includes IEnumerable<T> for any T
        if (!(value is IEnumerable))
            throw new InvalidOperationException(...); // or ArgumentException

        // Do some processing on it, for example cast to your type?
        base.DataSource = ((IEnumerable) value).Cast<MyType>();
    }