gpt4 book ai didi

c# - 使用索引器的存在作为方法的参数签名/契约(Contract)/类型

转载 作者:太空狗 更新时间:2023-10-30 00:32:37 25 4
gpt4 key购买 nike

例如,我将使用 SqlDataReader 和 DataRow 类:它们都定义了以下索引器:

公共(public)对象 this[int columnIndex] { get;放; }

用作方法参数类型的最小公分母类型是什么,以便可以以相同的方式传递和使用两者(以及任何其他实现相同索引器的类),例如:

void DoSomething(??? indexedObject)
{
string foo = indexedObject[0].ToString();
// let's ignore the presence of ToString()
// for the purpose of this question
}

它是对象吗?如果索引对象不是从 object 派生的怎么办(我认为这是可能的,尽管可能性很小)。

如果重要的话,我的目标是 .NET 3.5。

编辑:我正在寻找一些导致调用者传递实现所述索引器的对象的契约(Contract)执行。

最佳答案

Is it object?

差不多。没有可以使用的通用接口(interface)或类,所以 object实际上是唯一保证在层次结构中共享的东西。

What if the indexed object does not derive from object?

这在 .NET 中是不可能的。 System.Object是所有类型的基本类型,并且值始终可以被视为一个对象(即使它们确实需要装箱才能工作)。

但是,传递为 object不会提供对索引器的访问,除非通过反射。

唯一直接的方法是通过 dynamic ,但这需要 .NET 4(并且类型不安全,这意味着您可能会遇到运行时异常)。

更好的方法可能是提供一个 Func<T, int, string>这将允许您在调用站点指定如何提取值:

void DoSomething<T>(T object, Func<T, int, string> valueExtractor)
{
string foo = valueExtractor(object, 0);
}

然后通过以下方式调用:

DoSomething(indexedObject, (o,i) => o[i].ToString());

这允许您传入一个对象和一种机制,以在给定调用站点的索引的情况下提取值,这适用于任何类型。


编辑关于:

Edit: I am looking for some contract enforcement that causes callers to pass objects that implement said indexer.

这些类型都没有实现内置的契约或接口(interface),也没有任何方法可以根据索引器的存在来约束泛型。您将需要一种不同的方法,例如我建议使用委托(delegate)来提取值。

关于c# - 使用索引器的存在作为方法的参数签名/契约(Contract)/类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16615724/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com