Как передать массив структур в класс в C # - PullRequest
0 голосов
/ 24 октября 2011

Все, я испытываю трудности с передачей struct в конструктор класса.Я нахожусь в процессе многопоточности части существующего кода.В одном классе определена следующая структура:

SchemaFileRec[] m_TableList;

struct SchemaFileRec
{
    public ArrayList  saFile;
    public ArrayList  saImpTab;
    public ArrayList  saSheet;
    // And others...
    public int[]      nColHead;
    public int[]      nSkipBeg;
    public int[]      nSkipEnd;
    public string     strADTFld;
};

Это используется в методе (старый метод, называемый ExecCmd) для некоторой обработки.Я переписываю этот метод в класс;фактически подкласс BackgroundWorker.По сути, я использую метод, который имеет дело с какой-то «длительной» задачей, и многозадачен.У меня есть:

public class ExecCmdsThredded : BackgroundWorker 
{
    // Global variables and constants.
    private int nTable;
    private List<int> kPrmArray = null;
    private List<object> StructureArray = null;
    private SpreadsheetGear.IWorksheet worksheet;

    // Default constructor to handle thred properties.
    public ExecCmdsThredded()
    {
        WorkerReportsProgress = true;
        WorkerSupportsCancellation = true;
    }

    // Constructor to parse relevant parameters to worker.
    // Or as an array of objects public ExecCmdsThredded(object[] _StructArr, etc. 
    public ExecCmdsThredded(List<object> _StructArr, List<int> _kPrmArr, ArrayList[] _saCmd, 
                            int _nTable, SpreadsheetGear.IWorksheet _worksheet) : this()
    {
        this.nTable = _nTable;
        this.kPrmArray = _kPrmArr;
        this.StructureArray = _StructArr;
        this.worksheet = _worksheet;
    } 
    // ...

Теперь я хочу передать структуру сверху классу ExecCmdsThredded через конструктор, но мне никогда не приходилось делать это раньше, и я не уверен, возможно ли так, как яхочешь сделать это?Я мог бы явно передать каждый компонент struct, но я хочу избежать этого.

Спасибо за ваше время.

Ответы [ 2 ]

2 голосов
/ 24 октября 2011

Вы всегда можете передать массив объектов object [], а внутри вы можете поместить любой тип структуры или класса, это не рекомендуется из-за побочных / распаковывающих побочных эффектов.Пример того, что я имею в виду:

new ExecCmdsThredded(new object[] { new SchemaFileRec(), new AnotherSchema() });

Но я рекомендую отбросить структуры , создать классы, чтобы вы могли использовать вместо них Generics, сделать код болеепо крайней мере, читаемый.

1 голос
/ 24 октября 2011

Я чувствую себя некомфортно, когда начинаю проходить через структуры.Если у вас есть коллекция структур, которые вы хотите передать в качестве параметра, внимательно вернитесь к дизайну ... "Почему я использую структуру?"Я рекомендую преобразовать структуру в класс в большинстве случаев.

Есть несколько ссылок, которые помогут вам решить, использовать ли структуру или класс.Поиск через StackOverflow и MSDN

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...