1

是否可以创建一个返回类型并使用它的方法?

例如,假设我有一个 Person 类型和 Object 参数。你可能知道,如果我们想转换我们的 Object 参数,我们可以这样写:

object param;

((Person)param).executePersonMethod();

我的问题是如何编写一个返回 Person 类型的方法并使用它来代替具体的 Person 演员 - 我想写这样的东西:

public Type GetPersonType()
{
//return here type of person
}

然后使用

  ((GetPersonType())param).executePersonMethod();

可能吗?如果是,如何?

4

7 回答 7

4

您可以使用界面。

((IPerson)param).executePersonMethod();

每种类型的人都必须是 IPerson 并且在 IPerson 中您声明 executePersonMethod()

于 2013-09-19T07:34:02.860 回答
2

您也可以使用dynamic它。

请注意, usingdynamic将跳过任何编译时间检查该方法是否存在,如果不存在,将在运行时抛出异常。

由于存在这种风险,我只会在别无选择的情况下这样做,但很高兴知道该选项存在:

dynamic d = param;
d.executeWhateverMethodHereWithoutCompileTimeChecking();
于 2013-09-19T07:41:33.260 回答
2

是的你可以。有一种称为动态的新类型,它将在编译期间避免静态类型检查。

public dynamic GetPersonOrObjectWhichHasExecutePersonMethod()
{
 //return not the type but the object itself
 return new Person(); 
}

public class Person
{
    public void executePersonMethod()
    {
      // do something
    }
}

// this is how you invoke it
public void ExecuteMethod()
{
  dynamic obj = GetPersonOrObjectWhichHasExecutePersonMethod();
  obj.executePersonMethod();
}
于 2013-09-19T07:41:46.707 回答
1

也许你可以使用类似的东西:

Convert.ChangeType(param, typeof(Person)); 

它会将参数作为一个人返回。

于 2013-09-19T07:37:58.877 回答
0

不能在 a 上执行方法Type,您只能在特定的实例上执行方法Type。如果我理解正确,您应该能够使用@LavG给出的答案:

从GetPersonType方法返回的不是类型而是对象本身

编辑:根据您的评论:

  • 以下是一些 SO QA,它们将帮助您获得Typeusing 完全限定的命名空间和其他技术:

如何通过仅发送类的名称而不是类本身作为参数来获取类的类型?

Type.GetType("namespace.abClassName") 返回 null

  • 以下是如何在运行时从给定的 Type 生成类:

从运行时获取的类型动态生成一个类

于 2013-09-19T07:51:39.083 回答
0

虽然您可以使用 Generic 作为更好的选择,但是可以将 Type Converter 与反射结合使用:

Type type = GetPersonType();
var converted = Convert.ChangeType(param, type);
converted
     .GetType()
     .GetMethod(/*your desired method name in accordance with appropriate bindings */)
     .Invoke(converted, /* your parameters go here */);
于 2013-09-19T07:42:59.007 回答
0

利用

类型()

例子 :

        if (data.GetType() == typeof(Personne))
            return (Personne)data;
        else
            return new Personne();

之后,检查您的对象是否为空以了解是否正常

于 2013-09-19T07:38:58.910 回答