动态地将带有字符串参数的类型实例化到构造函数

时间:2011-03-17 04:44:16

标签: c# .net c#-4.0

我有以下代码:

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声明我怎么写?

2 个答案:

答案 0 :(得分:8)

由于您只对构造函数感兴趣,因此可以使用:

 Activator.CreateInstance(FileType, new string[] {filePath});

ActivatorSystem库中定义。

答案 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}));

我为提取构造函数创建了一个单独的方法,但如果您只打算使用它来实际创建实例,则可以在一个采用stringType参数的方法中重构它。请注意正确的错误处理。

然而,我会在这里考虑Factory method pattern,而不是立即潜入反射。我不知道它是否更适合你的需求,但它似乎可能确实如此。

编辑:有人关心解释投票吗?我承认CreateInstance更好,但我的方法具有更多控制和更好的错误处理的优势,所以我认为它至少值得在这里呈现