如何创建抽象类的实例?

4

当一个类被标记为抽象类时,我如何使用 Type.GetType(string typeName) 方法返回 Type 类的实例?

以下是我用来将 MyClass 类保存到 obj 变量中的代码。

Type obj = Type.GetType("ConsoleApplication.MyClass");

当我查找Type类的定义时,我发现了以下内容。

[NullableAttribute(0)]
[NullableContextAttribute(1)]
public abstract class Type : MemberInfo, IReflect
{

    [return: NullableAttribute(2)]
    public static Type? GetType(string typeName);

    /*
    / Other class members that, for the sake of keeping this question short, haven't been pasted 
    / into this Code sample.
    */
}


问题说您想要返回“Type”类的一个实例。您分享的代码正好做到了这一点。您是指您想创建“MyClass”类的一个实例吗? - Troy
非常有趣的问题。您无法创建抽象类的实例,因此类型为“Type”的实例/对象似乎违反了该规定。我只是(猜测)它是一个.NET Framework以不同方式处理的唯一抽象类。 - Frank Fajardo
1
@FrankFajardo 实际上是因为 obj 不是 Type 的实例,而是 RuntimeType 的实例,它继承并可赋值给 Type。请参见David的答案。 - user47589
@Amy,我明白了。那很有道理。 - Frank Fajardo
2个回答

4

当一个类已经被标记为抽象时,如何通过“Type.GetType(string typeName)”方法返回“Type”类的实例?

实际上返回的对象是抽象类型“Type”的具体子类型。要查看这个,请运行:

 Type obj = Type.GetType("ConsoleApplication.MyClass");
 var typeName = obj.GetType().Name;

来自文档:

Type是一个抽象基类,允许多个实现方式。系统将始终提供派生类RuntimeType。

Type类


0

你可以使用的一种方法是调用ReflectionOnlyGetType。你必须同时拥有程序集名称和完整类名。你可以传递参数来控制大小写敏感性以及是否抛出异常,如果没有找到类型。

var type = Type.ReflectionOnlyGetType("ConsoleApplication.Example, ConsoleApplication", true, true);

如果您知道包含的程序集,可以直接使用该程序集:
var assembly = typeof(Program).Assembly; // Use any class from target assembly
var type = assembly.GetType("ConsoleApplication.MyClass");

如果您正在使用.NET Core,似乎尚未实现ReflectionOnlyGetType源代码在调用时仅抛出PlatformNotSupported异常),因此您可能需要找到一种使用第二种方法的方式(该方法适用于.NET Core)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接