这被认为是反思吗?

时间:2017-10-05 17:41:29

标签: java c# reflection

今天我接受了面试,有人问我,下面的代码是否是C#中使用反射的好例子:

public abstract class Level{

    public string LevelID { get; private set;}
    public int LevelNumber {
        get{
            return int.Parse(LevelID.Substring(5).ToString());
        }
    }

    public Level(){
        this.LevelID = GetType().ToString();
    }

}

我假设使用上面的代码是:

class Level32 : Level{
    // call base class constructor...
}

然后

Level32 level = new Level32(); 
int id = level.LevelNumber; // would print 32.

我认为这个人就是这句话:this.LevelID = GetType().ToString();

我说过根本没有反思。

尽管我知道Java,但致电SomeClass.class.getName()并不会使用任何反映的C#。包,所以它根本不使用反射。我认为/p:DeployOnBuild=True /p:SkipInvalidConfigurations=true /p:WebPublishMethod=Package /p:PackageLocation=$(Build.ArtifactStagingDirectory) /p:PackageAsSingleFile=true也是这样构建的。

我是哑巴,还是他?

3 个答案:

答案 0 :(得分:7)

我认为,严格来说,"f1('bar')"电话是反思,是的。

请参阅https://stackoverflow.com/a/24377353/8261

但是,这只是最微不足道的反映,所以我不认为你是" a#34; Hello World"小子"折扣它。 : - )

  

我是哑巴,还是他?

我不喜欢这种框架:在我看来,你们两个都没有(或者你们两个都是,因为在琐碎的语义上争论)。

答案 1 :(得分:3)

Microsoft docs的第一句话:

  

Reflection提供描述程序集,模块和类型的对象(类型为Type)。您可以使用反射来动态创建类型的实例,将类型绑定到现有对象,或从现有对象获取类型

方法GetType()返回类型Type的对象,并且(显然)用于“从现有对象获取类型”。只看这些规则,我们可以说它是反思。

要说清楚,我认为这对于面试来说是一个不好的问题,有更好的方法来检查候选人是否理解反思。

答案 2 :(得分:0)

我没有50个声誉来添加评论。请不要介意我将其添加为答案。 :) 我们已经有一些关于 GetType()的好答案。

我想回答“使用反射是一个很好的例子/ 案例吗?”。

我认为预期的答案是“不”。

此处的关键字为抽象 GetType()。创建抽象类和接口的关键是调用者不必知道确切类型是什么。

如果我们仍然需要知道子类的实际类型,我们就没有正确使用它。

所以我认为这不是一个关于反思的问题。这更像是关于 OOP /继承的问题。

那只是我的2美分。