我有一个包含stateProfile
类和Inquiry
类的项目。Inquiry
类是静态的,它的工作是创建一个文本文件。文本文件的内容是使用存储在stateProfile
对象属性中的信息计算的(美国每个州一个,最终从XML文件中读取(。
我曾经能够共享所有状态的全局命名模式,但现在我需要满足基于stateProfile
对象命名它们的要求。
例如:我有一辆开往堪萨斯州的stateProfile
,还有一辆开往密苏里州的。
Inquiry inquiry = new Inquiry();
foreach(stateProfile p in _listOfProfiles){
inquiry.CreateFile(p);
}
在Inquiry.CreateFile(stateProfile p)
中,我有一个定义文件名的表达式:
sOutFileName = $"{p.prop1}_{p.prop2}_Literal3_{_staticProp.ToString("D4")}.txt";
能够将逻辑/表达式存储在stateProfile.outFileName
之类的属性(如(中的任何建议
public string outFileName {
$"{p.prop1}_{p.prop2}_Literal3_{_staticProp.ToString("D4")}.txt";
}
然后能够像下面这样引用Inquiry.CreateFile(stateProfile p)
中的该属性?
sOutFileName = $"{p.outFileName}";
我认为这种方法可能是您想要的。它允许您将C#脚本嵌入到XML中,并在代码中对其进行解释。
现在,每个州都可以有不同的文件名格式。
using System;
using Microsoft.CodeAnalysis.Scripting;
using Microsoft.CodeAnalysis.CSharp.Scripting;
using System.Threading.Tasks;
namespace ConsoleApp1
{
class Program
{
static async Task Main(string[] args)
{
// This was read from your XML file.
var filenameFormatterScript = "p => $"{p.Name.ToLower()}.txt"";
var options = ScriptOptions.Default.AddReferences(typeof(StateProfile).Assembly);
var sp = new StateProfile
{
Name = "Alabama",
FilenameFormatter = await CSharpScript.EvaluateAsync<Func<StateProfile, string>>(filenameFormatterScript, options)
};
Console.WriteLine(sp.Filename());
}
}
public class StateProfile
{
public string Name { get; set; }
public Func<StateProfile, string> FilenameFormatter { get; set; }
public string Filename()
{
return FilenameFormatter(this);
}
}
}
经过进一步思考,Alex的评论是最好的选择。
由于我希望在构建文件名公式时使用的所有属性都属于stateProfile
对象,因此我将方法GetFileName()
作为类成员,并传入我可能需要的任何其他属性。
我使用switch语句,随着我必须考虑的状态数量的增加,它可能会变得很难处理,但目前它是有效的。
public string GetFileName(int prop1) {
string sOutFileName = "";
switch (SourceState) {
case "MO":
sOutFileName = $"ReqPref_{this.stProfPropA}_{prop1}.txt";
break;
default:
sOutFileName = $"{this.stProfPropB}_{prop1}.txt";
break;
}
return sOutFileName;
}