我希望将.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
答案 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
可能不是测试绝对路径的最佳方法,但这是首先想到的。