代码之家  ›  专栏  ›  技术社区  ›  Erik Philips Gabriel Costa

名称of()是否总是等于typeof().name?

  •  4
  • Erik Philips Gabriel Costa  · 技术社区  · 6 年前

    我已经测试了类、方法、字段、属性和枚举,以查看当这不是真的时候是否存在任何情况?

    DotNetFiddle Example

    using System;
    
    public class Program
    {
        public static void Main()
        {
            var fooType = typeof(Foo);
            ThrowIfNotEqual(fooType.Name, nameof(Foo));
    
            var fi = fooType.GetField(nameof(Foo.field));
            ThrowIfNotEqual(fi.Name, nameof(Foo.field));
    
            var pi = fooType.GetProperty(nameof(Foo.property));
            ThrowIfNotEqual(pi.Name, nameof(Foo.property));
    
            var mi = fooType.GetMethod(nameof(Foo.method));
            ThrowIfNotEqual(mi.Name, nameof(Foo.method));
    
            var fi2 = fooType.GetNestedTypes()[0];
            ThrowIfNotEqual(fi2.Name, nameof(Foo.myEnum));
    
            ThrowIfNotEqual("TestThisMethod", "WorksAsExpected");
        }
    
        public static void ThrowIfNotEqual(string a, string b)
        {
            if (a != b) throw new InvalidOperationException($"Are Not Equal: {a} != {b}");
        }
    
        public class Foo
        {
            public string field;
            public string property { get; set; }
            public void method() { }
            public enum myEnum
            {
                A
            }
        }
    }
    

    结果:

    运行时异常(行-1):不相等:testThisMethod!=工作预期

    1 回复  |  直到 6 年前
        1
  •  9
  •   TheGeneral    6 年前

    是不是总是这样 nameof() 等于 typeof().Name ?

    不,有很多方法可以打破这一点,举个例子

    public class Foo<T>
    

    例如

    var fooType = typeof(Foo<string>);
    Console.WriteLine(fooType.Name);
    Console.WriteLine(nameof(Foo<string>));
    

    产量

    Foo`1
    Foo
    

    在许多情况下,您只会使用 名称()

    Console.WriteLine(nameof(int)); //CS1525    Invalid expression term 'int'   
    

    nameof (C# Reference)

    评论

    因为参数需要在语法上是一个表达式, 不允许列出很多不有用的东西。以下 值得一提的是会产生错误