Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 索引器的铸造内容';谁归还了收藏品?_C#_.net_Casting_Type Conversion - Fatal编程技术网

C# 索引器的铸造内容';谁归还了收藏品?

C# 索引器的铸造内容';谁归还了收藏品?,c#,.net,casting,type-conversion,C#,.net,Casting,Type Conversion,我有一个表/行/列数据结构设置。DtaTable类中有一个基于字符串的索引器返回DtaRows,DtaRow类中有一个基于字符串的索引器返回DtaColumns。所以你可以写一些像 return theTables["tablename"]["rowidentifier"]["columnname"]; 实际上,表中的对象不是DtaRows,而是大约三十多个子类中的一个,比如InflationRow和CurrencyRow。每个表只包含这些类型的对象,例如 MyInfRow = Inflati

我有一个表/行/列数据结构设置。DtaTable类中有一个基于字符串的索引器返回DtaRows,DtaRow类中有一个基于字符串的索引器返回DtaColumns。所以你可以写一些像

return theTables["tablename"]["rowidentifier"]["columnname"];
实际上,表中的对象不是DtaRows,而是大约三十多个子类中的一个,比如
InflationRow
CurrencyRow
。每个表只包含这些类型的对象,例如

MyInfRow = Inflations["General"];
表[“通货膨胀”][“一般”]

始终返回一个
InflationRow

现在为了更容易从C#访问它,我在更高级别上有一系列方法,如

public DtaTable Inflations { get {return pTables["Inflations"];} }
现在我想解决的问题是,当有人调用其中一个方法时,他们不会得到通货膨胀行,因为DtaTable有dtarow。比如说

MyInfRow = Inflations["General"];
返回一个DtaRow。所以我必须一直投

MyInfRow = (InflationRow)Inflations["General"];
我想把所有演员都除掉

到目前为止,我找到的唯一解决方案是为table对象创建36个新的子类,每个子类都覆盖索引器返回类型。这似乎比演员阵容更糟


有更简单的方法吗?

使用
as
而不是直接转换。如果强制转换有效,它将返回实例,否则将保持为NULL

public MyInfRow Inflations { get {return pTables["Inflations"] as MyInfRow } }

使用
作为
而不是直接转换。如果强制转换有效,它将返回实例,否则将保持为NULL

public MyInfRow Inflations { get {return pTables["Inflations"] as MyInfRow } }

如果您知道调用方主要只打算使用另一个索引器,则可以引入一个泛型类,前提是:

public class SpecializedTable<T> 
{
    private readonly DtaTable table;

    // Just in case anyone really wants this
    public DtaTable Table { get; }

    public SpecializedTable(DtaTable table)
    {
        this.table = table;
    }

    public T this[string row] { get { return (T) (object) table[row]; } }
}
您可能希望缓存该属性,以避免每次调用该属性时创建新对象


此时,此代码:
Inflations[“General”]
将为您适当地执行强制转换。

如果您知道调用方主要只打算使用另一个索引器,您可以引入一个通用类,前提是:

public class SpecializedTable<T> 
{
    private readonly DtaTable table;

    // Just in case anyone really wants this
    public DtaTable Table { get; }

    public SpecializedTable(DtaTable table)
    {
        this.table = table;
    }

    public T this[string row] { get { return (T) (object) table[row]; } }
}
您可能希望缓存该属性,以避免每次调用该属性时创建新对象


此时,此代码:
Inflations[“General”]
将为您适当地执行强制转换。

您是因为该强制转换很烦人,还是因为您不想强制转换?因为所讨论的代码是从VB转换而来的,而VB没有大小写,因为它们有多个索引器(基本上是这样的)因此,他们有一个返回正确的类。因此,如果我必须使用强制转换,我有150000多行代码要添加强制转换。你是因为它很烦人,还是因为你不想强制转换而试图摆脱强制转换?因为所讨论的代码是从VB转换而来的,那里没有大小写,因为它们有多个索引器(基本上)因此,他们有一个返回正确的类。因此,如果我必须使用强制转换,我有150000多行代码要添加强制转换。我认为您没有正确阅读问题-
Inflations
不会返回
InflationRow
,但它会返回索引器应该返回
InflationRow
的内容。OP没有抱怨有导致异常的铸造问题。我以为他在铸造方面有问题,我的错误。我认为你没有正确阅读问题-
Inflations
不返回
InflationRow
,但它返回的是索引器应该返回
InflationRow
的内容。OP没有抱怨有导致异常的铸造问题。我以为他在铸造方面有问题,我的错误。你能解释一下你为什么铸造表[行]在转换为目标类型之前转换为对象?@CodingFeles:使用泛型类型转换很复杂-除非您先转换为
对象
,否则不允许进行各种操作。这里可能不需要,但我想是的。哦,我想这正是我想要的。让我试试这个@JonSkeet什么是“数据视图”?我不确定我是否理解该代码的用途?在顶部有一个关于使用另一个索引器的注释。。。情况并非总是如此。其中很多都会以通货膨胀[“常规”]之类的方式停止。一些关于通货膨胀的属性可以吗,我还没有编译它。哦,等等,我知道这里发生了什么。我们正在创建第二个私有对象来包装底层DtaTable?我不确定这在这种情况下是否有效。。。让我想一想。你能解释一下为什么在转换为目标类型之前要将表[行]转换为对象吗?@CodingFeles:使用泛型类型转换很复杂-除非你先转换为
对象
,否则各种事情都是不允许的。这里可能不需要,但我想是的。哦,我想这正是我想要的。让我试试这个@JonSkeet什么是“数据视图”?我不确定我是否理解该代码的用途?在顶部有一个关于使用另一个索引器的注释。。。情况并非总是如此。其中很多都会以通货膨胀[“常规”]之类的方式停止。一些关于通货膨胀的属性可以吗,我还没有编译它。哦,等等,我知道这里发生了什么。我们正在创建第二个私有对象来包装底层DtaTable?我不确定这在这种情况下是否有效。。。让我思考一下。