.NET:在静态方法中确定"this"类的类型

Yeg*_*gor 92 .net c# static-methods types

在我可以使用的非静态方法中this.GetType(),它将返回Type.如何Type在静态方法中获得相同的内容?当然,我不能只写,typeof(ThisTypeName)因为ThisTypeName只在运行时才知道.谢谢!

Jar*_*Par 129

如果您正在寻找与this.GetType()静态方法相当的1衬里,请尝试以下方法.

Type t = MethodBase.GetCurrentMethod().DeclaringType
Run Code Online (Sandbox Code Playgroud)

虽然这可能比仅仅使用昂贵得多typeof(TheTypeName).

  • 这总是返回实现当前方法的类,而不是在子类的情况下调用它的类. (47认同)
  • 我想如果代码曾经被迁移到不同的类名或其他东西的话,避免错误很方便,但是无论如何,一个好的重构工具应该处理`typeof(TheTypeName)`。 (3认同)
  • Entrase,"昂贵的"Jared意味着它们对处理器来说代价高昂,通常意味着很慢.但他说,"更昂贵"意味着更慢.除非您正在设计火箭制导系统,否则可能根本不慢. (2认同)

Jon*_*eet 58

还有一些其他答案尚未明确澄清的内容,这与您在执行时仅提供类型的想法相关.

如果使用派生类型执行静态成员,则二进制文件中将省略实际类型名称.例如,编译此代码:

UnicodeEncoding.GetEncoding(0);
Run Code Online (Sandbox Code Playgroud)

现在使用ildasm ...你会看到调用是这样发出的:

IL_0002:  call       class [mscorlib]System.Text.Encoding 
[mscorlib]System.Text.Encoding::GetEncoding(int32)
Run Code Online (Sandbox Code Playgroud)

编译器解决了调用Encoding.GetEncoding- 没有UnicodeEncoding左边的痕迹.这让你对"当前类型"的想法毫无意义,我担心.


Rob*_*erc 24

另一种解决方案是使用自引导类型

//My base class
//I add a type to my base class use that in the static method to check the type of the caller.
public class Parent<TSelfReferenceType>
{
    public static Type GetType()
    {
        return typeof(TSelfReferenceType);
    }
}
Run Code Online (Sandbox Code Playgroud)

然后在继承它的类中,我创建一个自引用类型:

public class Child: Parent<Child>
{
}
Run Code Online (Sandbox Code Playgroud)

现在,Parent内部的调用类型typeof(TSelfReferenceType)将获取并返回调用者的Type而无需实例.

Child.GetType();
Run Code Online (Sandbox Code Playgroud)

-抢

  • 你好。我真的很喜欢并欣赏这个答案,因为它为我提供了一种从静态基函数中找到子类型的解决方法。 (2认同)
  • 两者(这个和 Steven 链接的那个)都不适用于基类实现者的继承者...孙子最终将得到 Child 类型...太糟糕了 C# 没有虚拟静态;) (2认同)

Joh*_*lla 6

您不能this在静态方法中使用,因此无法直接使用.但是,如果您需要某个对象的类型,只需调用GetType它并使this实例成为您必须传递的参数,例如:

public class Car {
  public static void Drive(Car c) {
    Console.WriteLine("Driving a {0}", c.GetType());
  }
}
Run Code Online (Sandbox Code Playgroud)

不过,这似乎是一个糟糕的设计.你确定你真的需要在自己的静态方法中获取实例本身的类型吗?这看起来有点奇怪.为什么不使用实例方法?

public class Car {
  public void Drive() { // Remove parameter; doesn't need to be static.
    Console.WriteLine("Driving a {0}", this.GetType());
  }
}
Run Code Online (Sandbox Code Playgroud)