On Wednesday, 22 June 2016 at 15:15:51 UTC, Thalamus wrote:
Hi everyone,
My project includes lots of .Net interop via C linkage. One of
the things I need to do is refer in C# to an interface declared
in the D code, and then to actually work with the interface
concretely in the D layer. So, I need to get a
TypeInfo_Interface object from a string passed in from C#.
The problem isn't in marshaling the string between C# and D,
but rather what to do with the string once I have it in D.
So in the D code, where interfaceName is the fully qualified
name of an interface, e.g. "MyPackage.MyModule.MyInterface",
what I would like is something like:
TypeInfo_Interface theInterface = new
TypeInfo_Interface(interfaceName);
But there's no such constructor.
No need for a constructor. typeid() returns a static instance
that's pre-allocated.
Apologies if this seems like it should be obvious, but I
couldn't find anything in the forums or the wider web. :)
No problem. What you need to do is to create a registry with all
the possible TypeInfo_Interfaces. This registry will have the
form of an associative array. Each TypeInfo_Interface will be
selectable with the fully qualified string, for example:
__gshared TypeInfo_Interface[string] registry;
interface Foo{}
interface Bar{}
static this()
{
registry[typeid(Foo).toString] = typeid(Foo);
registry[typeid(Bar).toString] = typeid(Bar);
}
That's the basic idea but with introspection (foreach(member;
traits....) you should be able to automate the creation of the
registry, in a smarter way.