Frederic GIRARDIN Ответов: 1

Как переопределить/расширить пару классов (list(of <element>), <element>) в другой DLL ?


Привет.

Я использую vb.net и я пытаюсь расширить и/или переопределить класс из ссылочной библиотеки DLL (называемой IFCX) в использующую библиотеку DLL (ESTX).
Весь Шуд спрашивает меня: "зачем ты это делаешь ?" причина-это сверхразум :
- Обе DLL имеют средства, но когда я использую ESTX, я тоже загружаю данные из IFCX, но объект IFCX должен отвечать вложенным значениям по отношению к ESTX.
- Когда IFCX был создан, он не предполагал, что ESTX будет существовать. Так что нет никакой причины присоединяться к этому в одной и той же DLL.
- IFCX предоставляет класс (как list(of IFCXItem)), я знаю, что мы можем наследовать объекты, но если я переопределяю IFCXitem, то список больше не будет хорошо типизирован, а наследование списка ничего не значит, потому что он мне нужен как типизированный список, поэтому связь между исходным и конечным используемым списком будет беспорядочной.

Поэтому я ищу образец с 2 проектами под visualstudio, с 2 классами (typed class + list(of typedclass) в первом, exented или partial class of typedclass в другом.

Точность #1 : я не включил их в корневое пространство имен, поэтому я предполагаю, что там root есть собственное имя DLL.

Что я уже пробовал:

в проекте ESTX я попытался написать это :
Namespace Global
 Namespace IFCX
  Partial class MyIFCXClass
    Public overridable readonly Property Image as System.drawwing.image
      Get
        '...
         return '...
      End Get
  End Class
 End Namespace
End Namespace


Но, похоже, это не работает.

Maciej Los

Интересная проблема...

Вы являетесь автором обоих dll-файлов? У вас есть исходные коды? Если да, то почему бы не создать еще одну версию библиотеки DLL IFCX?

Frederic GIRARDIN

Да, я являюсь автором обеих библиотек DLL. Каждая библиотека DLL представляет собой расширение файла; это означает, что каждая содержит методы лечения, соответствующие ее содержимому.
An ESTX file can have a reference to IFCX content. IFCX objects are custom objects that represent the extraction of an IFC file. A kind of alternative data format. These objects have an IFCX-compliant meaning, but once an ESTX references an IFCX file, it becomes its objects. The only solution I have found for the moment disappoints me! Create both a new class of <inherited element> from IFCX.element class to add functionality to my objects, but also a new class list <inherited elements>. I am therefore forced to monitor the changes in the IFCX list to reproduce them in ESTX. It's heavy and I'm convinced that there is another way to go about it ...

Richard Deeming

Зачем вам нужно создавать новый список? Один List<BaseClass> может счастливо содержать экземпляры DerivedClass ничего не сломав.

Frederic GIRARDIN

может быть, вы можете дать более подробную информацию или образец ?

Richard Deeming

class BaseClass { }
class DerivedClass : BaseClass { }

List<BaseClass> theList = new List<BaseClass>();
theList.Add(new BaseClass());
theList.Add(new DerivedClass());

Frederic GIRARDIN

Извините, что я программирую в VB. Поэтому я добавляю вам детали с помощью языка VB

NameSpace MyFileExtention
 Namespace IFCX
  Class BL_IFCX
   inherits businessLayer
   'entry point to manage IFCX data
   private _IMPORT_ELEMENTS as IMPORT_ELEMENTS

   Public sub new(aIFCXFile as string)
      mybase.new(aIFCXFile) ' => mybase.File = aIFCXFile : _datalayer = new datalayer(_file)
   End sub

   Public sub Load()
    _IMPORT_ELEMENTS = new IMPORT_ELEMENTS(Datalayer)
   End sub
  End Class

  Class IMPORT_ELEMENT
   'Item Class
    private ROW as datarow
    Public sub new(_row as datarow)
     ROW = _row
    end sub

   Property #PropertyName# as #PropertyType#
    get
      return ROW(#PropertyColumnNameMapped#)
    end get
    set (value as #propertyType#)
     ROW(#PropertyColumnNameMapped#) = Value
    end set
   end property
  END Class

  Class IMPORT_ELEMENTS
    inherits List(of IMPORT_ELEMENT
   'List Class
   private _datalayer as datalayer
   Public sub new(aDataLayer as datalayer)
    _datalayer = adatalayer
   end sub

   public sub load()
    'classic datatable/datarow loading
    dim dt as datatable = _datalayer.loadTable("IMPORT_ELEMENTS") ' => adapter.fill(...)
    for each _row in dt.rows
     me.add(new IMPORT_ELEMENT(_row)
    next
  End class
 End NameSpace

 NameSpace ESTX
  Class BL_ESTX
   inherits BusinessLayer
   'Class to manage ESTX Data
   private withevents _BL_IFCX AS IFCX.BL_IFCX
   private _ASSIGNATIONS
   private _IFCX_File as string

  Public sub new(aESTXFile as string)
   Mybase.new(aESTXFile) ' => mybase.File = aESTXFile : mybase.dataLayer = new datalayer(aESTXFile)
  end sub

  Public sub Load()
   'load properties ' => datalayer.loadTable("PROPERTIES")
   'check for property IFCX_File to set or not inner class property that run or not BL_IFCX load process
   _ESTX_ITEMS = new ESTX_ITEMS(Datalayer)
   _ASSIGNATIONS = New ASSIGNATION(Datalayer)
  end sub

  Public property IFCX_File as string
   get
    return _IFCX_File 
   end get
   set(value as string)
    If value<>"" and system.io.path.exist(value) then
       _IFCX_File = value
       _BL_IFCX = new IFCX.BL_IFCX(_IFCX_File)
       _BL_IFCX.load()
    End if
   end set
  end property

  private Readonly Property BL_IFCX as IFCX.BL_IFCX
   get
    return _BL_IFCX
   end get
  end property

  Public readonly property IMPORT_ELEMENTS as IFCX.IMPORT_ELEMENTS
   get
    Return _BL_IFCX?.IMPORT_ELEMENTS
   end get
  End property
  End Class

  Public Class ASSIGNATION
   ' relation between ESTX_ITEM and IFCX.IMPORT_ELEMENTS
   '...
   property ESTX_ITEM_ID as integer
    get
     return ROW("ESTX_ITEM_ID")
    get end
    set (value as integer)
     ROW("ESTX_ITEM_ID") = Value
     _ESTX_ITEM = Nothing
    end set
   end property

   Property IFCX_ITEM_ID as integer
    get
     return ROW("IFCX_ITEM_ID")
    end get
    set (value as integer)
     ROW("IFCX_ITEM_ID") = value
     _IFCX_ITEM = nothing
    end set
   end property
  End Class

  readonly Property ESTX_ITEM as ESTX_ITEM
   get
    if _ESTX_ITEM is nothing then
     raiseevent Ask_ESTX_ITEM(ESTX_ITEM_ID, _ESTX_ITEM)
    end if
    return _ESTX_ITEM 
   end get
  end property

  readonly Property IFCX_ITEM as IFCX.IMPORT_ELEMENT
   get
    if _IFCX_ITEM is nothing then
     raiseevent Ask_IFCX_ITEM(IFCX_ITEM_ID, _IFCX_ITEM)
    end if
    return _IFCX_ITEM 
   end get
  end property

  Public Class ASSIGNATIONS
   inherits list(of ASSIGNATION)
  End class

  Public Class ESTX_ITEM
   'exist without IFCX_IMPORTELEMENT

   Public readonly property ASSIGNATIONS as List(of ASSIGNATION)
    get
     dim _list as List(of ASSIGNATION)
     raisevent Ask_ASSIGGNATION(ID, _list)
     return _list
    end get
   end property
  End Class

  Public Class ESTX_ITEMS
   inherits list(of ESTX_ITEM)
  End Class

 End NameSp

Frederic GIRARDIN

жду с нетерпением

Extender Provider Objects

Frederic GIRARDIN

Но на самом деле этот вид записи, похоже, работает только с VS IDE, поэтому компонент наследует элементы.

1 Ответов

Рейтинг:
9

Frederic GIRARDIN

Imports System.Runtime.CompilerServices

Module MyClassExtended

<Extension()> _
Public Function Assignations(Sender as IFCX.IMPORT_ELEMENT,about as ESTX.BL_ESTX) as list(of ESTX.ASSIGNATION)
   dim _list as list(of ESTX.ASSIGNATION)
   'can't raise specific event Ask_Assignations because Ask_Assignations should not exist in IFCX metadata
   'can't rais generic event Ask(args), because not in the class !
   'can call OnAsk() who is doing Raisevent Ask(args) but weird !
   _list = about.Assignations.where(function(w) w.ID_IMPORTELEMENT = Sender.ID).tolist
   return _list
end function

End Module

Partial class BL_ESTX
 'Local Variable
 private _My_IMPORT_ELEMENTS as IFCX.IMPORT_ELEMENTS

 'IFCX endloading event help ESTX to catch it
 Private sub IFCX_EndLoading(Sender as object) handles _BL_IFCX.EndLoading
   _My_IMPORT_ELEMENTS = ctype(sender, BL_IFCX).My_Import_ELEMENTS
 end sub

 'a property to acces it ...
 public readonly Property My_Imports_Elements as IFCX.IMPORT_ELEMENTS
 get
     return _My_IMPORT_ELEMENTS
 end get
 end property

 ' a kind of use
 Public sub NoAssignationReport()
  My_Imports_Elements.foreach(sub(x) if x.Assignations(me).count = 0 then debug.print(x.Name))
 End sub

End class