1

我有这堂课:

public class SmartTable : DataTable
{
    public string this[int Row, int Column]  { ... }
    public string this[int Row, string Column]  { ... }
}

我想在 THIS[,] 上添加一个隐式运算符

然后我可以使用:

string s = smartT[a,b];

或者

int i = smartT[a,b];

我用谷歌搜索了这个,但即使我不知道如何搜索它。

我试过(基于 IntelliSense)声明如下:

public static implicit operator int[int r, int c](...) {...}

或者

public static implicit operator int (SmartTable sm, int a, int b)

并且不工作。

谢谢

=== 编辑 ===

这是一个数据表,一个表有字符串、整数、......

我想避免每次使用此表时都放入 Convert.To--(...) ...

如果我尝试将字段放在 int 上,是因为它是整数字段...我正在使用的解决方案是 create iGet(int C, int R), sGet(...), dGet(...)

4

1 回答 1

2

如果您可以更改SmartTable设计以返回或使用自定义类而不是原始string类型,那么您可以将自己的隐式转换添加到intor string

public class SmartTable : DataTable
{
    //dummy/hard-coded values here for demonstration purposes
    public DataValue this[int Row, int Column]  { get { return new DataValue() {Value="3"}; } set { } }
    public DataValue this[int Row, string Column]  { get { return new DataValue() {Value="3"}; } set { } }
}

public class DataValue
{
    public string Value;

    public static implicit operator int(DataValue datavalue)
    {
        return Int32.Parse(datavalue.Value);
    }

    public static implicit operator string(DataValue datavalue)
    {
        return datavalue.Value;
    }
}

还有一些用法:

string s = smartT[0, 0];
int i = smartT[0, 0];

Console.WriteLine(s);//"3"
Console.WriteLine(i);//3

请注意,这有点违背使用隐式运算符。例如,如果您DataValue.Value是不可转换的int(例如,如果它是“Hello World!”),它会抛出一个异常,这通常违反最佳实践,并且对于利用您的 API 的开发人员来说是意外的。

于 2013-05-31T14:18:39.963 回答