-1

我想我过去曾在 C++ 的上下文中问过这个问题(在我的问题历史中找不到它!!),解决方案是使用模板函数。由于 C++ 模板在编译时解析,它可以工作。但对于 C#,它没有。

public Hashtable ConvertToHashtable<T>(T source) where T has an index operator
{
    Hashtable table = new Hashtable();
    table["apple"] = source["apple"];

    return table;
}

目前的一种用法是将 OleDbReader 中的结果转换为哈希表,但我预计很快需要更多源类型。

4

4 回答 4

2

您可以使用一个接口:

public interface IIndexable<T> {
    T this[int index] { get; set; }
    T this[string key] { get; set; }
}

您的方法将如下所示:

public Hashtable ConvertToHashtable<T>(T source) 
    where T : IIndexable<T> {

    Hashtable table = new Hashtable();
    table["apple"] = source["apple"];
    return table;

}

一个简单的来源是:

public class Source : IIndexable<Source> {

    public Source this[int index] {
        get {
            // TODO: Implement 
        }
        set {
            // TODO: Implement 
        }
    }

    public Source this[string key] {
        get {
            // TODO: Implement 
        }
        set {
            // TODO: Implement 
        }
    }
}

一个简单的消费者是:

public class Consumer{

    public void Test(){
        var source = new Source();
        var hashtable = ConvertToHashtable(source);
        // you haven't to write: var hashtable = ConvertToHashtable<Source>(source);
    }

}
于 2011-09-25T07:49:54.110 回答
1

你能添加一个约束来指定类型参数是一个IList吗?

public Hashtable ConvertToHashtable<T>(T source) where T : IList
{
    Hashtable table = new Hashtable();
    table["apple"] = source["apple"];

    return table;
}

Item属性this[int index]不是运算符,它是包含类型的属性成员。IList暴露了这一点。

于 2011-09-25T07:49:18.710 回答
0

如果运行时检查足够好,您可以使用反射作为评论员之一,建议如下:

if (typeof (T).GetProperties().Any(property => property.Name.Equals("Item")))
于 2011-09-25T08:00:29.050 回答
0

C# 中的运算符没有泛型类型约束- 这是 C# 中泛型的限制之一。

于 2011-09-29T12:43:24.007 回答