如何编写一个函数来使用索引运算符获取任何对象

发布于 2024-12-06 06:33:03 字数 366 浏览 1 评论 0原文

我想我过去曾在 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 中的结果转换为哈希表,但我预见很快需要更多源类型。

I think I have asked this in the context of C++ (Can't find it in my question history!!) in the past and the solution was to use a template function. As C++ template resolve at compile time, it works. But for C#, it doesn't.

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

    return table;
}

One usage at the moment is to convert the result in OleDbReader to hashtable, but I am forseeing the need for more source types soon.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

因为看清所以看轻 2024-12-13 06:33:04

您可以使用接口:

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);
    }

}

You can use an interface:

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

and your method will be seen as below:

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

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

}

A simple source is:

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 
        }
    }
}

A simple consumer is:

public class Consumer{

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

}
只涨不跌 2024-12-13 06:33:04

您可以添加一个约束来指定类型参数是 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 公开了这一点。

Could you add a constraint to specify that the type parameter was an IList?

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

    return table;
}

The Item property this[int index] is not an operator, its a property member of the containing type. IList exposes this.

禾厶谷欠 2024-12-13 06:33:04

C# 中的运算符没有通用的类型约束 - 它是以下之一C# 中泛型的局限性。

There are no generic type constraints for operators in C# - it is one of the limitations of generics in C#.

喜爱皱眉﹌ 2024-12-13 06:33:04

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

if (typeof (T).GetProperties().Any(property => property.Name.Equals("Item")))

If runtime checks are good enough, you could use reflection as one of the commentator suggested as follows:

if (typeof (T).GetProperties().Any(property => property.Name.Equals("Item")))
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文