我很新,所以这可能是一个“愚蠢的问题”,或者可能不合适,请酌情提出建议。
我正在探索一些C#的功能,本周我正在讨论反思。当我读到http://msdn.microsoft.com/en-us/library/145sfyea.aspx时,我很困惑,从我能告诉我没有得到MissingMethodException(找不到匹配的构造函数。),当我认为应该这样做时。
问题:此代码是否应该在指出的位置抛出异常?
using System;
using System.Collections.Generic;
using System.IO;
using System.Reflection;
namespace Test
{
abstract class Vehicle
{
public string type { get; set; }
}
class Van : Vehicle
{
public Van()
{
System.Console.WriteLine("van!");
this.type = "van";
// ...
}
}
class Program
{
static void Main(string[] args)
{
List<String> things = new List<String>();
things.Add("Van");
things.Add("Car");
List<Vehicle> inventory = new List<Vehicle>();
foreach (String s in things)
{
Vehicle vehicle = Assembly.GetExecutingAssembly().CreateInstance("Test" + "." + s, true) as Vehicle;
if (vehicle != null)
{
inventory.Add(vehicle);
}
else
{
System.Console.WriteLine("Should an attempt to create an instance of"+ "Test" + "." + s+ " have thrown an exception? " );
};
}
Console.Read();
Console.Read();
}
}
}
答案 0 :(得分:4)
没有。如果存在MissingMethodException
类型但没有公共无参数构造函数,则会得到Test.Car
。如果根本找不到类型,则返回null
;如果找到了类型,但找不到与您提供的参数列表匹配的公共构造函数,则然后抛出MissingMethodException
。
来自MSDN:
返回值
键入:System.Object
使用默认构造函数创建的指定类型的实例;如果找不到 typeName ,则返回null。
答案 1 :(得分:1)
它会,但只有在现有类型中找不到构造函数时才会这样。 (即它是私人的)。在你的代码中,没有'Car'类,因此没有类型可以搜索构造函数,因此返回一个null对象。
这会抛出一个MissingMethodException:
class Car : Vehicle {
private Car() { // I'm private and you cannot find me.
System.Console.WriteLine("car!");
this.type = "car";
}
}
答案 2 :(得分:0)
如果类型的构造函数无法解析那么肯定,我期待一个例外。但是如果找不到有问题的类型,则该方法被记录为返回null。
有一些像Type.GetType()
这样的方法接受一个布尔标志,它确定是否应该引发异常......我想这个特定的方法会在某种程度上受益,但是你总是可以调用{{1在尝试创建实例之前,如果无法找到类型,则指定您需要例外。