Ссылка Object Array Name как свойство - PullRequest
0 голосов
/ 04 мая 2011

Как получить имя свойства массива объектов для использования в функции 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' в сам массив объектов, но оно уже включено в имя объекта .. Я просто не могу понять, как ссылаться на имя объекта .. либо Я не знаю или я не знаком с Reflection.

Я ценю вашу помощь или предложения по этому вопросу.

Ответы [ 5 ]

1 голос
/ 04 мая 2011

Как получить имя свойства массива объектов для использования в функции SWITCH / CASE?

По не делает преобразование. Вы можете использовать string в выражении switch, но не object[].

1 голос
/ 04 мая 2011

Вы не можете, потому что нет такого «имени» для объекта. Это даже не имеет смысла - многие переменные могут содержать ссылку на один и тот же объект. Какое из них должно быть "имя"?

Представьте на мгновение, что будет такая функция с именем 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;
    }
}
0 голосов
/ 04 мая 2011

если объявление переменной 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> для хранения ваших массивов, чтобы вы могли искать массив по заданному имени или наоборот

0 голосов
/ 04 мая 2011

поведение по умолчанию ToString () - возвращать имя класса.Это может быть переопределено в любом классе, так как все классы наследуются от объекта.string.ToString () - это поведение, которое вы ищете, поэтому вам, вероятно, нужно сначала привести объект обратно к строке (хотя часть массива хитрая, так как я не знаю, что делает метод ConvertStringtoObjectArray), но вам нужно сделатьприведение для доступа к тому, что вы ищете.

Я предполагаю, что объект [] является символом []?в таком случае приведение должно быть таким же простым, как приведение объекта к типу char [], а затем к строке.

0 голосов
/ 04 мая 2011

Без дополнительной информации я могу только догадываться, что делает 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)
    {
        // ...
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...