非常量表达式作为C#中的属性参数

时间:2014-05-09 08:10:14

标签: c#-4.0

我希望将.csv文件作为属性参数,但最初使用相对路径,如下所示:

[DataSource("Microsoft.VisualStudio.TestTools.DataSource.CSV", datapath, "data#csv", DataAccessMethod.Sequential), DeploymentItem("data.csv")]

在这种情况下,字符串datapath必须是const string。但如果我用

获得完整的路径
const string datapath = Environment.CurrentDirectory + @"data.csv";

这不起作用,因为我发现在C#中分配给const的表达式需要在编译时保持不变。我还尝试了private readonly而不是const,但编译器抱怨参数必须是const类型。那么我怎样才能将这个相对数据路径作为参数?

我正在使用面向.NET framework 4.0的Visual Studio 2012

1 个答案:

答案 0 :(得分:0)

一种可能的方法是派生自己的DataSource类。例如:

[AttributeUsageAttribute(AttributeTargets.Method, AllowMultiple = false)]
public class MyDataSource : DataSource
{
    public MyDataSource(string providerInvariantName, string fileName, string tableName, DataAccessMethod dataAccessMethod)
        : base(providerInvariantName, Path.Combine(Environment.CurrentDirectory, fileName). tableName, dataAccessMethod)
    {
    }
}

在此示例中,您将传入一个名为fileName的参数,然后在将其传递到基础构造函数之前,您将使用Path.Combine创建文件的绝对路径。然后代替DataSourceAttribute,您将使用MyDataSourceAttribute

编辑1:

或者,作为替代方案,您可以从上面的DataSource派生,但是不是构建绝对路径并将其传递给基础构造函数,而是简单地传递所有未修改的参数。然后,在构造函数中,如果connectionString不表示绝对路径,则会抛出异常。例如:

[AttributeUsageAttribute(AttributeTargets.Method, AllowMultiple = false)]
public class MyDataSource : DataSource
{
    public MyDataSource(string providerInvariantName, string connectionString, string tableName, DataAccessMethod dataAccessMethod)
        : base(providerInvariantName, connectionString, tableName, dataAccessMethod)
    {
            if(!Path.IsRooted(connectionString))
                throw new ArgumentException("You have to pass an absolute path!");
    }
}

这样,如果您尝试使用非绝对路径,现在将获得异常。请注意,使用Path.IsRooted可能不是测试绝对路径的最佳方法,但这是首先想到的。