Jump to page: 1 2
Thread overview
Reflection in D
Jan 27, 2017
medhi558
Jan 27, 2017
Adam D. Ruppe
Jan 28, 2017
medhi558
Jan 28, 2017
medhi558
Jan 28, 2017
rumbu
Jan 28, 2017
medhi558
Jan 28, 2017
rumbu
Jan 28, 2017
medhi558
Jan 28, 2017
Adam D. Ruppe
Jan 28, 2017
medhi558
Jan 28, 2017
rumbu
Jan 28, 2017
medhi558
January 27, 2017
Hello, I would like to know if it is possible to recover all classes in the project in D.

Example in c# :

Assembly asm = Assembly.GetAssembly(typeof(MyClass));

foreach (Type type in asm.GetTypes())
{
}
January 27, 2017
On Friday, 27 January 2017 at 21:02:13 UTC, medhi558 wrote:
> Hello, I would like to know if it is possible to recover all classes in the project in D.

Yes, `foreach(mod; ModuleInfo) foreach(lc; mod.localClasses)`... but why do you want it? That facility is kinda limited in doing many things with.
January 28, 2017
I develop a game server. Currently I use a switch :

import protocol.messages.connection.Message1;
import protocol.messages.connection.Message2;
import protocol.messages.queues.Message3;
import ......

import protocol.messages.NetworkMessage;

class ProtocolMessageManager
{
	public static NetworkMessage GetInstance(uint id)
	{
	      switch(id)
              {
                 case Message1.Id:
                     return new Message1();
                 case Message2.Id:
                     return new Message2();
                 .....

                 default:
	              return null;
              }
        }
}

what I want to do :

import protocol.messages.NetworkMessage;

class ProtocolMessageManager
{
    private static TypeInfo_Class[uint] m_types;

    public static void Init()
    {
        foreach(mod; ModuleInfo)
	{
	    foreach(TypeInfo_Class lc; mod.localClasses)
	    {
                if(lc.name.indexOf("protocol.messages") != -1)
                {
                    NetworkMessage c = cast(NetworkMessage)lc.create();
	            ProtocolMessageManager.m_types[c.MessageId] = lc;
                }
	    }
					
	}
    }

    public static NetworkMessage GetInstance(string id)
    {
	auto v = (id in ProtocolMessageManager.m_types);
	if (v !is null)
	 return cast(NetworkMessage)ProtocolMessageManager.m_types[id].create();
	else
         return null;
    }
}
January 28, 2017
I have a last question, currently i use :
if(lc.name.indexOf("protocol.messages") != -1)

To know if the class is a NetworkMessage, Would be possible to do this

if(lc is NetworkMessage)


Sorry for my English, i speak french.
January 28, 2017
On Saturday, 28 January 2017 at 07:10:27 UTC, medhi558 wrote:
> I have a last question, currently i use :
> if(lc.name.indexOf("protocol.messages") != -1)
>
> To know if the class is a NetworkMessage, Would be possible to do this
>
> if(lc is NetworkMessage)
>
>
> Sorry for my English, i speak french.

if (auto nm = cast(NetworkMessage)lc)
{
  //do something with nm
}


January 28, 2017
On Saturday, 28 January 2017 at 07:39:51 UTC, rumbu wrote:
> On Saturday, 28 January 2017 at 07:10:27 UTC, medhi558 wrote:
>> I have a last question, currently i use :
>> if(lc.name.indexOf("protocol.messages") != -1)
>>
>> To know if the class is a NetworkMessage, Would be possible to do this
>>
>> if(lc is NetworkMessage)
>>
>>
>> Sorry for my English, i speak french.
>
> if (auto nm = cast(NetworkMessage)lc)
> {
>   //do something with nm
> }

It doesn't work because lc is TypeInfo_Class
January 28, 2017
On Saturday, 28 January 2017 at 08:18:15 UTC, medhi558 wrote:
> On Saturday, 28 January 2017 at 07:39:51 UTC, rumbu wrote:
>> On Saturday, 28 January 2017 at 07:10:27 UTC, medhi558 wrote:
>>> I have a last question, currently i use :
>>> if(lc.name.indexOf("protocol.messages") != -1)
>>>
>>> To know if the class is a NetworkMessage, Would be possible to do this
>>>
>>> if(lc is NetworkMessage)
>>>
>>>
>>> Sorry for my English, i speak french.
>>
>> if (auto nm = cast(NetworkMessage)lc)
>> {
>>   //do something with nm
>> }
>
> It doesn't work because lc is TypeInfo_Class

In this case:

if (lc == typeid(NetworkMessage))
January 28, 2017
On Saturday, 28 January 2017 at 07:03:51 UTC, medhi558 wrote:

>     public static NetworkMessage GetInstance(string id)
>     {
> 	auto v = (id in ProtocolMessageManager.m_types);
> 	if (v !is null)
> 	 return cast(NetworkMessage)ProtocolMessageManager.m_types[id].create();
> 	else
>          return null;
>     }
> }

As long as your class has a default constructor, you can use directly Object.factory(id):

public static NetworkMessage GetInstance(string id)
{
  return cast(NetworkMessage)(Object.factory(id));
}
January 28, 2017
abstract class NetworkMessage
{
    uint MessageId;
    //....
}

override class QueueStatusUpdateMessage : NetworkMessage
{
    uint MessageId = 1;
    //....
}

override class Message2 : NetworkMessage
{
    uint MessageId = 2;
    //....
}

override class Message3 : NetworkMessage
{
    uint MessageId = 3;
    //....
}

And I would like to retrieve all the classes that are based on NetworkMessage.

class ProtocolMessageManager
{
    private static TypeInfo_Class[uint] m_types;

    public static void Init()
    {
        foreach(mod; ModuleInfo)
	{
	    foreach(TypeInfo_Class lc; mod.localClasses)
	    {
                if(....) //lc is NetworkMessage so
                {
                    NetworkMessage c = cast(NetworkMessage)lc.create();
	            ProtocolMessageManager.m_types[c.MessageId] = lc;
                }
	    }
					
	}
    }

    public static NetworkMessage GetInstance(string id)
    {
	auto v = (id in ProtocolMessageManager.m_types);
	if (v !is null)
	 return cast(NetworkMessage)ProtocolMessageManager.m_types[id].create();
	else
         return null;
    }
}

January 28, 2017
On Saturday, 28 January 2017 at 09:05:13 UTC, rumbu wrote:
> As long as your class has a default constructor, you can use directly Object.factory(id):
>
> public static NetworkMessage GetInstance(string id)
> {
>   return cast(NetworkMessage)(Object.factory(id));
> }

It isn't possible. My function when I receive data :

private void ReceivedData(char[] buffer)
{
    BinaryReader reader = new BinaryReader();
    uint id = reader.ReadUInt();
    uint length = reader.ReadInt();
    if(length > reader.Available.length)
    {
       //waiting for the rest
       return;
    }

    NetworkMessage message = ProtocolMessageManager.GetInstance(id);
    message.Deserialize();

    //.....
}

« First   ‹ Prev
1 2