在 C# 中检查对象的编译时类型
Checking object's compile-time type in C#
考虑以下代码:
using System;
public class Program
{
public static void Main()
{
A m1 = new B();
B m2 = new B();
Console.Write("m1: ");
m1.fun();
Console.Write("m2: ");
m2.fun();
}
}
abstract class A
{
public abstract void fun ();
}
class B : A
{
public override void fun()
{
if (this.GetType() == typeof(A)) // ????
Console.WriteLine("A");
else Console.WriteLine("B");
}
}
我要你修改 if
语句,以便程序为 m1
编写 A
,为 m2
编写 B
。
我一直在尝试 GetType()
、typeof
、is
和 as
的各种组合,但无法实现。
我不确定您的赋值规则是什么,但是如果您在基础 class 中有一个虚拟方法并在派生中覆盖它,您总是会得到“B”。
如果允许您更改类型的继承,您可以这样做:
public class Program
{
public static void Main()
{
A m1 = new B();
B m2 = new B();
Console.Write("m1: ");
m1.Fun();
Console.Write("m2: ");
m2.Fun();
// m1: A
// m2: B
}
}
abstract class A
{
public void Fun() => Console.WriteLine("A");
}
class B : A
{
public new void Fun() => Console.WriteLine("B");
}
不适用于虚拟方法,但由于泛型方法解析仅使用 compile-time 类型信息,因此您可以使用它。你可能例如定义以下扩展方法:
public static class Extensions
{
public static void Fun<T>(this T instance)
{
Console.WriteLine(typeof(T).Name);
}
}
并像现在调用虚拟方法一样调用它:
m1.Fun();
考虑以下代码:
using System;
public class Program
{
public static void Main()
{
A m1 = new B();
B m2 = new B();
Console.Write("m1: ");
m1.fun();
Console.Write("m2: ");
m2.fun();
}
}
abstract class A
{
public abstract void fun ();
}
class B : A
{
public override void fun()
{
if (this.GetType() == typeof(A)) // ????
Console.WriteLine("A");
else Console.WriteLine("B");
}
}
我要你修改 if
语句,以便程序为 m1
编写 A
,为 m2
编写 B
。
我一直在尝试 GetType()
、typeof
、is
和 as
的各种组合,但无法实现。
我不确定您的赋值规则是什么,但是如果您在基础 class 中有一个虚拟方法并在派生中覆盖它,您总是会得到“B”。
如果允许您更改类型的继承,您可以这样做:
public class Program
{
public static void Main()
{
A m1 = new B();
B m2 = new B();
Console.Write("m1: ");
m1.Fun();
Console.Write("m2: ");
m2.Fun();
// m1: A
// m2: B
}
}
abstract class A
{
public void Fun() => Console.WriteLine("A");
}
class B : A
{
public new void Fun() => Console.WriteLine("B");
}
不适用于虚拟方法,但由于泛型方法解析仅使用 compile-time 类型信息,因此您可以使用它。你可能例如定义以下扩展方法:
public static class Extensions
{
public static void Fun<T>(this T instance)
{
Console.WriteLine(typeof(T).Name);
}
}
并像现在调用虚拟方法一样调用它:
m1.Fun();