Передача определения структуры в C # - PullRequest
0 голосов
/ 22 марта 2019

У меня проблема с передачей определения структуры функции. Не экземпляр структуры, а определение.

Мы открыты для альтернативных методов делать то, что мы хотим, но сейчас мы пытаемся это сделать -

Мы пишем пользовательский элемент управления. Этот элемент управления предназначен для отображения данных в виде списка с заголовками, но какой «список» может потребоваться отобразить, неизвестно во время разработки. Прямо сейчас мы придерживаемся подхода, который заключается в том, что для упрощения работы мы передадим функции Constructor и / или GetHeaders определение Struct. Заголовки будут извлечены из имен полей, найденных в переданном определении структуры, с последующим поступлением данных как в отдельные объекты, так и в списки объектов этого типа структуры.

Пример. На стороне управления:

    private void GetHeaders( dynamic _strc )
        {
        //Type _str_type = ((ObjectHandle) _str).Unwrap().GetType();
        FieldInfo[] fi = _strc.GetFields( BindingFlags.Public | BindingFlags.Instance );

        int _i = 0;

        foreach (FieldInfo _f in fi)
            {
            textBox1.Lines[_i] = _f.Name;
            }

        textBox1.Refresh();
        }

-Пожалуйста, обратите внимание, я просто пытаюсь убедиться, что могу разобрать структуру. Мы не знаем, сработает ли это на самом деле, поскольку мы не можем получить тест для компиляции из-за того, что ниже.

У пользователя будет собственное определение структуры, к которому у Control не будет прямого доступа.

    public struct MineStruct
        {
        String ID;      // So we know who they are
        String Name;    // What we call them to their face
        String Nickname;// What we call them behind their back
        String Address; // We know where they live
        int Mileage;    // How far they've gone
        int Millage;    // How much they'll pay.  Oh, they'll pay...
        }

Он будет передаваться во время выполнения, как мы надеялись, во что-то вроде этого:

    private void button1_Click(object sender, EventArgs e)
        {
        GetHeaders( MineStruct );  //<-Error messaage here
        }

Сообщение об ошибке, которое мы получаем: «Form1.MineStruct» - это тип. Который недопустим в данном контексте » Я пытался изменить функцию GetHeaders, чтобы она взяла «Type», но ничего не помогает.

Итак, мои вопросы по порядку ...

1) Это хороший способ подойти к проблеме? Мы полностью открыты для другого пути, даже для прохождения целого класса, но мы хотели бы сохранить его легким, что мы считаем, что это будет.

2) Это вообще возможно?

3) Легко ли это?

4) Если так, как мы передаем определение структуры функции в C #?

Ответы [ 3 ]

0 голосов
/ 22 марта 2019

То, что вы называете «определением», известно как Type в C #.Если вам известно имя типа, о котором вы хотите получить информацию (как в вашем случае), вы можете использовать typeof(MineStruct), чтобы получить объект Type (который, как вы упомянули, вы пытались использовать в качестве параметра GetHeaders), из которого выможно вызвать GetFields, чтобы получить его поля.Если у вас есть объект, о котором вы хотели бы получить информацию о типе, вам нужно было бы вместо этого вызвать myObj.GetType().

Кроме того, поля структуры имеют вид private (ситуация по умолчанию в C #),поэтому вам нужно будет использовать BindingFlags.NonPublic как в этом ответе .

0 голосов
/ 22 марта 2019

ОГРОМНОЕ СПАСИБО всем!Собрав воедино различные ответы, мы приступили к работе.

1) Изменение параметра получения в GetHeaders на «Type» и использование «typeof» в вызывающей функции привело к тому, что компилятор оказался на нашей стороне.

2) Добавление флага привязки «.NonPublic» открыло структуру для просмотра.

3) Использование Общего дало нам лучший подход к заполнению данных после того, как элемент управления был установлен.

Я думаю Я отправил голосование всем, но я не настолько знаком с тем, как работает StackOverflow, как мне хотелось бы, поэтому я надеюсь, что вы все получили кредит, которого вы заслуживаете!Еще раз спасибо !!

0 голосов
/ 22 марта 2019

Может быть, использовать универсальный метод вместо передачи динамического в параметре, чтобы убедиться, что параметр является структурой:

private void GetHeaders<T>(T str) where T : struct
{
     //Your code...
}    
...