今天我接受了面试,有人问我,下面的代码是否是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
也是这样构建的。
我是哑巴,还是他?
答案 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美分。