Du benutzt da "datei.Free". Deshalb muss ich wohl annehmen, dass du entweder kein Oxygene nutzt, oder ShineOn benutzt.
ShineOn ist eine Library, die Delphi-Krams in .Net zu emulieren versucht.
Eine rein theorethische Möglickeit für eine TypeloadEx wäre das Free.
Aber nur um 5 Ecken und 7 Kanten...
In der Datei TObject.pas würdest du das hier finden und wenn alle Odds und der Rest des Universums gegen dich verschworen wären, wäre es vllt möglich, dass der class ctor von DisposableHelper<FileStream> mit einer SecurityException stirbt.
Delphi-Quellcode:
105 procedure TObjectExtender.Free(o: Object);
106 begin
107 o.Destroy;
108 end;
109
110 type
111 DisposableHelper<T> nested in TObjectExtender
112 = private static class
113 public
114 constructor;
115 property DisposeCall : Action<T>; readonly;
116 procedure DisposeReferenceType(o: T);
117 procedure DisposeValueType(o: T);
118 end;
119
120 procedure TObjectExtender.Destroy<T>(o: T);
121 begin
122 // dispose, if necessary. noop, otherwise.
123 DisposableHelper<T>.DisposeCall(o);
124 end;
125
126 procedure TObjectExtender.Free<T>(o: T);
127 begin
128 Destroy<T>(o);
129 end;
130
131 constructor TObjectExtender.DisposableHelper<T>;
132 begin
133 var typeRef := typeOf(T);
134 var call : Action<T>;
135 // dispose, if necessary. noop, otherwise.
136 if not typeRef.IsSealed
137 or typeOf(IDisposable).IsAssignableFrom(typeRef) then
138 call := @DisposeReferenceType
139 else
140 call := @DisposeValueType;
141
142 DisposeCall := call;
143 end;
144
145 procedure TObjectExtender.DisposableHelper<T>.DisposeReferenceType(o: T);
146 begin
147 TObjectExtender.Destroy(Object(o));
148 end;
149
150 procedure TObjectExtender.DisposableHelper<T>.DisposeValueType(o: T);
151 begin
152 // noop
153 end;
Edit: Okay da hätte ich wohl vorher die Seite aktualisieren sollen.
Ich lasse es trotzdem drin, vllt. hilft es ja dem nächsten, der über sowas stolpert...