【问题标题】:C# Get class declaration nameC#获取类声明名称
【发布时间】:2018-04-25 08:31:54
【问题描述】:

是否可以(动态)获取一个类的声明名称,并在构造函数中将其作为参数传递以在类本身中设置名称变量?

例子:

public class Foo
{
    public string name;
    public Foo()
    {
        name = GetClassName();
    }
}

public class SomeOtherClass
{
    Foo className = new Foo();
    Console.WriteLine(foo.name);
}

结果我希望它写成:"className"。

【问题讨论】:

  • 你想要类名“foo”还是变量名“className”?你的例子说变量名,但你说类名
  • className 不是“声明名称”(无论应该是什么),而只是 local 变量的名称。局部变量名称在运行时没有意义,并且不再为人所知(调试目的除外)。
  • 所以你想要一个类的实例以它被声明/存储的第一个字段命名?我不认为这是可能的......当实例没有被放入一个字段时,这个/这应该如何工作,例如当你只是return new Foo()来自某种工厂方法时?
  • 为什么一个类的实例应该关心它的reference是如何命名的?就我的理解而言,这听起来很奇怪。变量的名称与它所引用的对象完全无关。
  • 这是一个非常相似(如果不相同)的问题:Finding the variable name passed to a function。

标签: c# class declaration


【解决方案1】:

没有。这是不可能的。不使用参数是无法传入变量名的。

这是你能得到的最接近的:

Foo className = new Foo(nameof(className));

【讨论】:

    【解决方案2】:

    这听起来像是一个奇怪的要求。变量只不过是对对象的引用。该引用的名称与 what 这个变量引用没有任何关系。因此,实际引用的对象对它的引用一无所知。事实上,您甚至可能对同一个Foo-instance 有多次 引用。那么 instance 应该如何知道您指的是哪个变量呢?那么在下面的例子中应该发生什么:

    var f = new Foo();
    var b = f;
    

    现在你有两个对Foo 的同一个实例的引用。实例无法知道哪个软管是正确的,除非您通过使用参数(例如向您的构造函数)提供该信息。如果你有一个工厂来创建你的Foo-instance,事情会变得更糟:

    void CreateFoo()
    {
        return new Foo();
    }
    // ...
    var f = CreateFoo();
    

    现在您有了进一步的间接性,Foo 的构造函数肯定不会冒泡通过调用堆栈中的所有层,直到它到达某个可能获得实际名称的 assignement。事实上,您甚至可能没有将您的实例分配给任何东西——尽管这只是一个好主意:

    CreateFoo();  // create an instance and throw it away
    

    无论如何,如果您想将实例的成员设置为某个值,您应该提供该值给实例。 Patrick 的回答向您展示了如何做到这一点。

    【讨论】:

    • 虽然我完全同意你所说的,但这感觉不像是一个答案,更像是一个扩展评论 - 特别是因为 "Patrick 的答案向你展示了如何做到这一点。”
    • @ManfredRadlwimmer 我同意你的观点,但只是渴望得到答案。特别是它向 OP 展示了如何解决他/她的 实际 问题,这当然是难以猜测的并且可能是一个 xy 问题。
    • 毫无疑问,这是一个重要的补充,我只是担心你可能会被标记为 NAA,但现在不太可能进行最后一次编辑。
    • @ManfredRadlwimmer:“这个问题无法回答”本身就是一个答案(该死的悖论)。或者,至少,这是唯一可能的答案,也是最好的 OP 可以得到的。这个答案就是这样一个答案,详细说明了为什么这个问题一开始就没有意义。
    • @HimBromBeere 感谢您的回复和一些解释。我想要实现的目标很简单,当您创建一个新的 Foo 时,它应该是 "" 或无名的,因为它没有名称。对于您的 b = f 示例,在这种情况下, b 应该与 f 具有相同的名称。为什么我想要声明名称?我正在研究 C# 中的行为树系统,您可以创建节点。但不是像这样重复输入: Node countToThree = new Node("CountToThree");我想自动设置该名称,以便更方便用户使用
    猜你喜欢
    • 2017-05-05
    • 2011-11-21
    • 2016-07-18
    • 2017-06-19
    • 2011-05-31
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    相关资源
    最近更新 更多