reference Object Array Name作为属性

时间:2011-05-03 22:23:42

标签: c# .net object

如何获取要在SWITCH / CASE函数中使用的对象数组的属性名称,如下所示?关于如何做到这一点的任何其他建议表示赞赏。

Object[] objEURUSD = ConvertStringtoObjectArray(string val1);

Object[] objAUDUSD = ConvertStringtoObjectArray(string val2);

Object[] objGBPUSD = ConvertStringtoObjectArray(string val3);

示例功能使用

Object[] mvavgEURUSD = mvavgObject(objEURUSD);


private Object[] mvavgObject(Object[] val)
{

    string sym = val.ToString()  // this does not return the name it returns 'System.Object'

    switch (sym)
    {
        case "objEURUSD":

            // do something
            break;

        case "objAUDUSD":

            // do something
            break;

        case "objGBPUSD":
            // do something
            break;

    }
}

我可以在对象数组本身中包含对象'EURUSD'的名称,但它已经包含在对象的名称中..我只是无法弄清楚如何引用对象的名称..要么我不知道或者我不熟悉反思。

感谢您对此事的帮助或建议。

5 个答案:

答案 0 :(得分:1)

你不能因为对象没有这样的“名字”。这甚至没有意义 - 许多变量可以保存对同一对象的引用。哪一个应该是“名字”?

想象一下,会有一个名为GetName()的函数。在这些情况下,程序会输出什么?

案例1:

var a = new MyObject();
var b = a;
Console.WriteLine(GetName(b)); // Is it "a" or "b"?

案例2:

Console.WriteLine(GetName(new MyObject())); // What is the name now?

案例3:

Console.WriteLine(GetName(null)); // I guess you can return null here, but see case 4:

案例4:

MyObject a = null;
Console.WriteLine(GetName(a)); // Should this be "a" or null?

依此类推。

如果你想给你的对象“名字”,你必须自己这样做。也许创建一个像这样的“NamedObject”包装类:

class NamedObject<T>
{
    public readonly T Object;
    public readonly string Name;

    public NamedObject(string name, string value)
    {
        this.Object = value;
        this.Name = name;
    }
}

答案 1 :(得分:1)

  

如何获取要在SWITCH / CASE函数中使用的对象数组的属性名称?

通过进行转换。您可以在switch语句中使用string,但不能使用object[]

答案 2 :(得分:0)

如果没有进一步的信息,我只能猜出ConvertStringtoObjectArray的作用。我的猜测是,它使用字符串作为键来查找内容,然后返回一些值的数组。

在大多数情况下,我希望原始字符串不再包含在对象数组中。因此,显然,你无法检索它,所以你必须“记住”它,即传递它。

例如,而不是

Object[] objEURUSD = ConvertStringtoObjectArray(myVal);
Object[] mvavgEURUSD = mvavgObject(objEURUSD);

private Object[] mvavgObject(Object[] val)
{
    // ...

你可以这样写:

Object[] mvavgEURUSD = mvavgObject(myVal);

private Object[] mvavgObject(string val)
{
    Object[] objEURUSD = ConvertStringtoObjectArray(val);

    // The string is in the parameter ‘val’, so we can use it here
    switch (val)
    {
        // ...
    }
}

答案 3 :(得分:0)

ToString()的默认行为是返回类名。这可以在任何类中重写,因为所有类都从object继承。 string.ToString()是你正在寻找的行为所以你可能需要先将对象强制转换回字符串(虽然我不知道ConvertStringtoObjectArray方法的作用,但数组部分很棘手),但是你需要做一个施放以获取您正在寻找的东西。

我假设object []是char []?如果是这样,强制转换应该像将对象转换为char []然后转换为字符串一样简单。

答案 4 :(得分:0)

如果“objEURUSD”的变量声明在你的当前范围内,你可以将你的参数与那个变量进行比较,看看两者是否都引用同一个对象...这不会查找某种名称,但也许它是你想要什么...

Object[] objEURUSD; //initialized somewhere else


private Object[] mvavgObject(Object[] val)
{
   if(val==objEURUSD)
   {
      //it's the array referenced by objEURUSD ...
   }
}

作为替代方案,您可以使用Dictionary<string,Object[]>Dictionary<Object[],string>来存储数组,这样您就可以查找给定名称的数组,反之亦然