在对象中使用ordereddictionary的通用函数

时间:2017-04-21 11:01:39

标签: c#

我有一个“MyObject”类型的对象列表。该类包含orderedDictionary。我想在泛型函数中使用orderedDictionary

public class MyObject
{
    public OrderedDictionary Columns { get; set; }
}

我的通用功能

    private void KeepSelectedColumns<T>(List<T> OperateList)
    {
        List<string> ToBeRemoved = new List<string>();
        foreach (T fVal in OperateList)
        {
            // error in fVal.Columns
            foreach (DictionaryEntry Col in fVal.Columns)
            {
                 ...
                 ...
            }
        }
    }

编译器错误是'T'不包含'Columns'的定义,并且没有扩展方法'Columns'可以找到接受类型'T'的第一个参数(你是否缺少using指令或汇编引用? )

2 个答案:

答案 0 :(得分:1)

如果你想将这个类型用于你的衍生物MyObject,那么就像这样约束

private void KeepSelectedColumns<T>(List<T> OperateList) where T : MyObject
{
        List<string> ToBeRemoved = new List<string>();
        foreach (T fVal in OperateList)
        {
            // error in fVal.Columns
            foreach (DictionaryEntry Col in fVal.Columns)
            {
            }
        }
}

答案 1 :(得分:1)

由于您对T的类型没有任何限制,它可以是“任何” - 但不是您可以传入的所有内容,因为类型参数T具有成员属性名为Columns,因此编译器会抱怨。

例如,您可以传入List<int>,因为这会满足参数,但int没有Columns成员。

你确定要在这里使用泛型吗?除非你使用MyObject作为其他类的基类,否则你需要明确“非通用”的行为 - 它太具体了。

如果MyObject是基类,您可以使用泛型但需要提供更多类型约束 - 您的函数签名将如下所示:

private void KeepSelectedColumns<T>(List<T> OperateList) where T : MyObject

有关类型约束的详细信息,请参阅here