Как отправить тип класса в другой класс и создать экземпляр этого класса? - PullRequest
0 голосов
/ 16 мая 2018

Я работаю над библиотекой, которая поможет реализовать выделенные серверы для всех видов приложений (в основном моя цель - игры).Я работаю с сокетами и хочу внедрить какую-то систему команд, где пользователи смогут вызывать функции на сервере.У меня проблема, потому что я хочу позволить пользователю реализовать интерактивную командную среду в созданном им классе, о котором моя библиотека должна знать.Я создал этот шаблонный пример того, как все это структурировано:

Реализовано мной, часть библиотеки (очень упрощенно):

public class UserInfo //class containing info about user
{
    public int id;

    public UserInfo(int _id)
    {
        id = _id;
    }
}

public class UserManager
{
    List<UserInfo> userInfos;

    public UserManager(List<UserInfo> _userInfos) //We get out infos from somewhere...
    {
        userInfos = _userInfos; //...and keep reference to them

        //SetupChildClassAndInfos();
    }

    //I'd like to have something like that BUT I don't know 
    //how ChildClass is called so I can't just type it like here

    /*
    List<ChildClass> childs = new List<ChildClass>();

    void SetupChildClassAndInfos()
    {
        foreach (var userInfo in userInfos)
        {
            ChildClass child = new ChildClass();
            child.someInfo = userInfo;
            childs.Add(child);
        }
    }
    */


    //I tried working with generics but failed miserably xd
    List<T> childs = new List<T>();
    public void GetChildClass<T>()
    {
        foreach (var userInfo in userInfos)
        {
            T child = new T();
            child.userInfo = userInfo;
            childs.Add(child);
        }
    }
    //of course it doesn't work and makes no sense xD but I hope you kinda g
    //get what I'm trying to accomplish
}

public class UserClass //Base class for further implementation containing 
                       //userInfo that user needs to know about
{
    public UserInfo userInfo;
}

Пример реализации кем-то другим, я не знаю какChildClass будет называться:

public class ChildClass : UserClass //there needs to be access to UserClass informations
{
    CustomManager customManager;

    [Command] //attribute making method be called automaticly when is the right time
    public void Message(string _message) //A method made by a user BUT(!) he will never use it directly
    {
        customManager.ReceiveMessage(userInfo.id, _message);
    }
}
public class CustomManager
{
    UserManager userManager; //assume we somehow have reference

    public CustomManager()
    {
        userManager.GetChildClass<ChildClass>(); //sending information in beginning to infoManager how I implemented my ChildClass (doesn't work)
    }


    public void ReceiveMessage(int _id, string _message)
    {
        Debug.Log("We got message: " + _message + " from user with id: " + _id);
    }
}

Поэтому мой вопрос заключается в том, как отправить пользовательский класс в UserManager и создать экземпляры этого класса?Возможно, то, что я пишу, не имеет никакого смысла, и мой подход глуп, не стесняйтесь критиковать.

Ответы [ 2 ]

0 голосов
/ 16 мая 2018

Что плохого в том, чтобы иметь только словарь IReadOnlyDictionary<string, object>?Вы обеспокоены боксом типов значений?Взгляд на ваш код убеждает меня в том, что еще слишком рано переходить к более сложным решениям.Поэтому имеет смысл абстрагировать эту часть в интерфейс и реализовать ее в простейшем виде: с помощью словарей (a-ka JavaScript).

0 голосов
/ 16 мая 2018

Сделать CustomManager универсальным классом

Общая собственность в C #

OR

Использовать внедрение зависимостей через реализацию принципа инверсии зависимостей с использованием spring.net или инфраструктуры Unity.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...