我有以下代码:
if (FileType == typeof(ScanUploadFile))
{
files.Add(new ScanUploadFile(filePath));
}
if (FileType == typeof(FaxFile))
{
files.Add(new FaxFile(filePath));
}
if (FileType == typeof(BulkScanFile))
{
files.Add(new BulkScanFile(filePath));
}
if (FileType == typeof(SpecialCategoryFile))
{
files.Add(new SpecialCategoryFile(filePath));
}
如果没有IF声明我怎么写?
答案 0 :(得分:8)
由于您只对构造函数感兴趣,因此可以使用:
Activator.CreateInstance(FileType, new string[] {filePath});
Activator
在System
库中定义。
答案 1 :(得分:-1)
使用GetConstructors
对象的Type
方法并选择具有string类型的单个参数的方法,然后调用它。
像这样:
private ConstructorInfo GetStringConstructor(Type type)
{
return (from ctor in type.GetConstructors()
let pars = ctor.GetParameters()
where pars.Length == 1 && pars[0].ParameterType == typeof(string)
select ctor).FirstOrDefault();
}
像这样使用它:
var ctor = GetStringConstructor(typeof(Test));
if (ctor != null)
files.Add(ctor.Invoke(new string[] {filePath}));
我为提取构造函数创建了一个单独的方法,但如果您只打算使用它来实际创建实例,则可以在一个采用string
和Type
参数的方法中重构它。请注意正确的错误处理。
然而,我会在这里考虑Factory method pattern,而不是立即潜入反射。我不知道它是否更适合你的需求,但它似乎可能确实如此。
编辑:有人关心解释投票吗?我承认CreateInstance
更好,但我的方法具有更多控制和更好的错误处理的优势,所以我认为它至少值得在这里呈现