Ik ben op zoek naar een manier om in C# ergens een generieke interface te definiëren, zodat die in meerdere assemblies bekend is. Het doel is natuurlijk om deze objecten later te kunnen hergebruiken in meerdere applicaties met mogelijk een ander doel. Zie het volgende voorbeeld:

Het doel is dus om de IO interface generiek te maken voor alle DLLs. Het maakt niet uit wat de implementatie verder is. Zo kan ik in de applicatie een lijst bijhouden van alle IO's en daar willekeurige acties op uitvoeren.
Hoe kan ik nu in de onderliggende DLLs de interface bekend maken? Als hij alleen gedefinieerd is in de applicatie, of alleen in de DLLs, kent een van beide het type niet.
Ik heb geprobeerd om exact dezelfde interface definitie (dus in dezelfde namespace en dezelfde naam) óók in de DLL te zetten, maar dan krijg ik compiler fouten. Dit is eigenlijk de manier zoals C++ het doet met de header files.
De manieren die ik heb gevonden zijn:
http://gsraj.tripod.com/dotnet/reflection.html
Interfaces dynamisch gebruiken m.b.v. reflection
http://stackoverflow.com/...e-in-different-assemblies
Interface definiëren in een losse assembly
http://stackoverflow.com/...de-contracts-in-interface
Code contracts. Wellicht is dit iets, maar dit zegt mij niet veel
Hoe krijg ik in C# nou die mooie type overlap die de C++ linker zo goed voor elkaar krijgt?

Het doel is dus om de IO interface generiek te maken voor alle DLLs. Het maakt niet uit wat de implementatie verder is. Zo kan ik in de applicatie een lijst bijhouden van alle IO's en daar willekeurige acties op uitvoeren.
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
| namespace IOControl { public interface IIO { bool Get(); void Set(bool value); } public class App { private List<IIO> mIOList; public App() { mIOList = new List<IIO>(); mIOList.Add(new IO1( ... )); mIOList.Add(new IO2( ... )); } } } |
Hoe kan ik nu in de onderliggende DLLs de interface bekend maken? Als hij alleen gedefinieerd is in de applicatie, of alleen in de DLLs, kent een van beide het type niet.
Ik heb geprobeerd om exact dezelfde interface definitie (dus in dezelfde namespace en dezelfde naam) óók in de DLL te zetten, maar dan krijg ik compiler fouten. Dit is eigenlijk de manier zoals C++ het doet met de header files.
De manieren die ik heb gevonden zijn:
- De interface in een losse assembly, dus in een los project zetten en in alle betrokken projecten een reference toevoegen.
- [i]Dit werkt, maar je krijg een ontzettende grote brei aan DLL files en aan vooral aan onderlinge references binnen projecten. Eigenlijk geen oplossing.[/i]
- Met reflection het type "converteren" en voor alle interfaces een wrapper schrijven.
- [i]Ook dit werkt, maar de nadelen zijn wel duidelijk denk ik. Je gebruikt reflection, je creeërt een overhead aan wrappers en ook dit levert extra DLLs op.[/i]
http://gsraj.tripod.com/dotnet/reflection.html
Interfaces dynamisch gebruiken m.b.v. reflection
http://stackoverflow.com/...e-in-different-assemblies
Interface definiëren in een losse assembly
http://stackoverflow.com/...de-contracts-in-interface
Code contracts. Wellicht is dit iets, maar dit zegt mij niet veel

Hoe krijg ik in C# nou die mooie type overlap die de C++ linker zo goed voor elkaar krijgt?