Downcasting в C#

Вы могли также сделать это:

$dump = print_r($variable, true);
6
задан The Demigeek 15 July 2009 в 18:56
поделиться

11 ответов

or, to avoid the PITA aspect, use reflection... (try this...)

EDIT: use property, not Field as I had originally written...

public class NewLead : Lead
{
    public bool Insert;
    public NewLead(Lead lead, bool insert)
    {
        Insert = insert;
        foreach (PropertyInfo pi in typeof(Lead).GetProperties())
            GetType().GetProperty(pi.Name).SetValue
               (this, pi.GetValue(lead,null), null);
    }
}
7
ответ дан 8 December 2019 в 12:22
поделиться
public class LeadListItem
{
    public Lead Lead { get; set; }
    public bool ShouldImport { get; set; }
}

т.е. не копируйте Содержимое объекта Lead, просто сохраните ссылку на него в новом объекте LeadListItem, который добавляет дополнительную информацию «вне» исходного объекта.

Если вы хотите, чтобы свойства Lead отображались в сетке, почти наверняка есть способ делая это. Почему бы не задать этот вопрос вместо того, чтобы голосовать против меня за то, что я дал вам правильный ответ на этот вопрос!

4
ответ дан 8 December 2019 в 12:22
поделиться

Пара опций, которые вы могли пропустить:

  • Вы можете обновить сам объект Lead, чтобы он имел свойство Import (по умолчанию значение false).
  • Вы можете настроить объект "ImportLead" для обработки Lead как полезной нагрузки (даже сделать его универсальным, если хотите), поэтому вам не понадобится большой конструктор.
  • Создайте новый список объектов Lead. или перечислимый, содержащий только те объекты, которые вы хотите импортировать в первую очередь.
3
ответ дан 8 December 2019 в 12:22
поделиться

You can only downcast, if the object to be downcast is really an object of that type.

An easier way to solve your problem would be to have a DisplayLead class, such as:

  public class DisplayLead {
      Lead lead;
      bool bImport;
  }

which would also help you separating stored data from their representation in a GUI.

1
ответ дан 8 December 2019 в 12:22
поделиться

Что вы хотите сделать, так это отобразить столбец флажка в вашей сетке и не связывать его вообще с вашими объектами Lead. Вы используете отмеченные столбцы (и, возможно, исходный список) для создания нового набора List, который будет вашим списком импорта.

Затем обработайте все, что вы хотите сделать с вновь созданным списком.

Edit: Одно дело, будьте осторожны при работе со списками, потому что каждый объект класса на самом деле является только указателем на класс, поэтому, если вы работаете с исходным списком и делаете что-то вроде:

List<Lead> Importable = new List<Lead>();

for(int i=0, i++, i<viewGrid.Count)
    if(viewGrid[i].CheckedColumn.Checked)
        Importable.Add(OriginalList[i]);

Эти объекты будут существовать в обоих списках, и если вы редактируете данные Лид в любом списке будет изменен.

1
ответ дан 8 December 2019 в 12:22
поделиться

Я не могу склонить голову к чему-то, чего нет. Если объект был создан как Lead , то он не может быть понижен до любого производного класса. Если он был создан как LeadWithImportCheckbox , а затем возвращен в ваш код как Lead , то его можно уменьшить.

Совет: тип проверки во время выполнения с - ] оператор.

1
ответ дан 8 December 2019 в 12:22
поделиться

There are many ways to do this, but the "right" way pops out because of what you said, here:

For ease of programming (and use), I'm parsing the text file into a List object, and using a DataGridView to display the leads by setting the DataSource property of the DataGridView.

What I want to do is add a column to the grid, called "Import," with a checkbox that the user can check to indicate whether or not each lead should be imported.

Your Lead object stands well on its own, and you want to attach some metadata to it -- you don't want to create another Lead classification (i.e. the LeadWithImportCheckbox class).

So, the best approach in your case is to have a class like so:

public class LeadInfo 
{
    private Lead lead;
    private bool shouldImport;

    public LeadInfo(Lead lead)
    {
        this.lead = lead;
        this.ShouldImport = false;
    }

    public bool ShouldImport 
    { 
        get { return shouldImport;  }
        set { shouldImport = value; }  
    }
}

This will scale well when you want to add more metadata to your list, like if you want to send yourself email reminders about them every week.

1
ответ дан 8 December 2019 в 12:22
поделиться

Я видел правильное решение в списке так много раз, что чувствую себя пяткой, снова публикующим его, но лучший способ приблизиться к этому - написать оболочку для объекта Lead, которая включает импорт flag.

Если свойства объекта Lead не отображаются в GridView, потому что вы привязываете данные к объекту, то напишите сквозные свойства, которые отражают свойства Lead в объекте-оболочке.

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

Если вас беспокоит, что объект Lead изменится так много раз в будущем, что изменится на обертка будет громоздкой, вы можете изучить динамическую генерацию кода на основе объекта Lead, который автоматически сгенерирует объект-оболочку с теми же полями, что и объект Lead, плюс флаг импорта. Хотя, честно говоря, это намного больше работы, чем вам, вероятно, понадобится для чего-то столь же простого, как это.

1
ответ дан 8 December 2019 в 12:22
поделиться

As a quick and dirty solution, you can create your 'checkbox' object as a different object that contains an instance of Lead.

public GridLead {
   public bool Import { get; set; }
   public Lead Lead { get; set; }
}

This way you can easily add more 'grid' properties to this object, while still always retaining a reference to the Lead details without hardcoding property cloning into it.

0
ответ дан 8 December 2019 в 12:22
поделиться

If your Lead class had a copy constructor (e.g. "Lead(Lead otherLead)"), LeadWithImportCheckbox would inherit that and you could just call the base Lead constructor in the LeadWithImportCheckbox constructor - hence no need for LeadWithImportCheckbox to be aware of the details of Lead.

0
ответ дан 8 December 2019 в 12:22
поделиться

Рекомендуем вам попробовать изменить (обновить) импортированные объекты потенциальных клиентов.

Попробуйте начать с примеров здесь ...

0
ответ дан 8 December 2019 в 12:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: