如何获取要在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'的名称,但它已经包含在对象的名称中..我只是无法弄清楚如何引用对象的名称..要么我不知道或者我不熟悉反思。
感谢您对此事的帮助或建议。
答案 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>
来存储数组,这样您就可以查找给定名称的数组,反之亦然