Преобразование «значения» в свойство C # в качестве универсального элемента IEnumerable <> в переопределении DataSource - PullRequest
0 голосов
/ 28 августа 2010

Вот ваше основное переопределение источника данных:

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

То, что я хотел бы сделать в методе установки, приведено значение в IEnumerable <> и выполнить некоторые манипуляции с ним (или сгенерировать исключение, если я не могу привести его к IEnumerable <> ), а затем передать его в base.DataSource .Буду признателен за любую помощь в достижении этого.

Ответы [ 3 ]

1 голос
/ 28 августа 2010
public override object DataSource
{
    get
    {
        return base.DataSource;
    }
    set
    {   
        if (!(value is IEnumerable<MyType>))
            throw new InvalidOperationException(...); // or ArgumentException

        base.DataSource = (IEnumerable<MyType>) value;
    }
}

или, может быть ...

    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>();
    }
1 голос
/ 28 августа 2010

Вы не упомянули версию .net, но linq предоставляет метод AsEnumerable (), который делает то, что вы ищете.

Использование будет value .AsEnumerable <<em> type > ()

См. здесь

0 голосов
/ 28 августа 2010

Вы можете обойтись простым приведением типа, как показано на нескольких примерах ниже.Обратите внимание, что вы должны быть осторожны при входе в любой 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;
    }
}
...