将文件命名模式存储(和使用)到类属性



我有一个包含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;
        }

最新更新