Доступ к методам в типе объекта - PullRequest
1 голос
/ 14 августа 2011

Я пытаюсь выяснить, как сделать что-то вроде следующего (это было напечатано на макушке, так что оно может быть не точным на 100%, но должно быть понятно) в csharp, но я ' Я не совсем уверен, как.

class Test
{
  private __construct() {}

  public static function GetInstance($name)
  {
      if (file_exists($name . ".php"))
      {
            return new $name();
      }
      else
      {
            return null;
      }
  }
}

Я знаю, как вернуть объект, который я хочу, на основе ввода, но я должен вернуть объект, потому что я не уверен, какой объект запросит вызывающий. Однако, когда я понятия не имею, как получить доступ к методам в возвращаемом объекте.

Ответы [ 3 ]

2 голосов
/ 14 августа 2011

Если я правильно понимаю ваш псевдокод, вам придется привести полученный объект к ожидаемому типу, чтобы вы могли получить доступ к открытым методам этого типа:

Foo myFoo = (Foo) Test.GetInstance("Foo");
string bar = myFoo.Bar();

Также проверьте Activator.CreateInstance() метод, который в основном делает то, что хочет сделать ваш GetInstance метод.

0 голосов
/ 14 августа 2011

Надежда эта ветка также помогает. Здесь еще несколько примеров отражения.

// create instance of class DateTime
DateTime dateTime = (DateTime)Activator.CreateInstance(typeof(DateTime));


// create instance of DateTime, use constructor with parameters (year, month, day)
DateTime dateTime = (DateTime)Activator.CreateInstance(typeof(DateTime),
                                                       new object[] { 2008, 7, 4 });
0 голосов
/ 14 августа 2011

Если я правильно интерпретирую ваш вопрос, я думаю, что вы хотите создать объект по имени типа.Есть несколько способов сделать это.Это один пример:

public static class Test
{
    public object CreateInstance(string typeName)
    { 
        Type type = Type.GetType(typeName);
        return Activator.CreateInstance(type);
    }
}

Предполагается, что typeName является полным именем типа, включая пространство имен, и что этот тип имеет конструктор по умолчанию (без аргументов).В противном случае метод потерпит неудачу.Используйте, например, вот так (вы должны привести пользователя к вашему типу, чтобы получить доступ к методам в типе пользователя.

User user = (User)Test.CreateInstance("Some.Namespace.User");

// Now methods and propertes are available in user
Console.WriteLine("User name: "+user.Name);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...