C# 访问对象类型中的方法

C# 访问对象类型中的方法,c#,.net,datetime,C#,.net,Datetime,我正试图弄清楚如何在csharp中执行以下操作(这是在我的头顶上打出来的,所以可能不是100%准确,但应该能让人明白这一点),但我真的不确定如何执行 class Test { private __construct() {} public static function GetInstance($name) { if (file_exists($name . ".php")) { return new $name(); }

我正试图弄清楚如何在csharp中执行以下操作(这是在我的头顶上打出来的,所以可能不是100%准确,但应该能让人明白这一点),但我真的不确定如何执行

class Test
{
  private __construct() {}

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

我知道如何根据输入返回我想要的对象,但我必须返回一个对象,因为我不确定调用方将请求哪个对象。但是,当我不知道如何访问返回对象中的方法时。

假设我正确理解您的伪代码,您必须将结果对象强制转换为您期望的类型,以便您可以访问该类型的公共方法:

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

还要检查这个方法,它基本上完成了您的
GetInstance
方法想要做的事情。

如果我正确地解释了您的问题,我认为您需要按类型名称创建一个对象。有很多方法可以做到这一点。这是一个例子:

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);
希望线程也有帮助。是一些更多的反射示例

// 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 });

这将无法编译。在C#中的标识符中不能有美元符号。什么是“函数”?这是我想在C#中实现的PHP示例。在C#中,当您运行程序时,您可能没有任何类的代码文件。我认为如果您描述您希望代码执行的操作会更好。创建一个特定类型的对象,给定类型名称?我将发布一个这样的示例。为崎岖不平的道路做好准备。真正的OOP会给你一记耳光。然后你会发现,这很重要。谢谢你的回复,但我发现了。代码spinet基本上就是你用PHP创建工厂的方式。我用C#works完成的方式,但可能不“正确”我真的不知道。它仍然是松散耦合的,足以让我的dll工作,而不会引起问题。我会说回到C#(我已经好几年没有接触过了)这是一个有趣的经历,我会继续玩下去。那么调用的类不需要知道其他类的名称吗?我希望调用的类不知道共享同一接口的类组。从上面的示例中,我可以有两个不同的类,可以返回共享同一接口的类面,但对相同的方法有不同的逻辑。@William:如果它们都共享相同的接口,只需声明您的方法以返回接口类型,就不需要强制转换。哦,我不知道我可以这样做。谢谢!如果可以的话,我会给您100分!