1

我在“FileData.cs”文件中声明了属性。我想为另一个类“PdfMergerViewModel.cs”中的每个属性分配值。

文件数据.cs

        public class FileData
        {
        private BatchData _batch;
        public FileData(BatchData batch)
        {
            this._batch = batch;
        }

        public string FileName { get; set; }
        public string VersionNormalizedFileName { get; set; }
        public string OrderNumber { get; set; }
        public DateTime OrderDate { get; set; }

        public string Metadata { get; private set; }
        public bool IsDeleted { get; set; }
        public string FilePath { get; set; }

        public string Centerpoint { get; set; }
        public string BatchID { get; set; }
        public string RegionalPrefix { get; set; }
        public string City { get; set; }
        public string FunctionLocation { get; set; }
        public string KeyMap { get; set; }
        public string State { get; set; }
        public string StreetNumber { get; set; }
        public string StreetName { get; set; }
        public string UnitNumber { get; set; }
        public string SendToGIS { get; set; }
        public string PipeBeforeFilename { get; set; }

        public IList<FileData> VersionFiles
        {
            get
            {
                return _batch.Files.Where(x => x.VersionNormalizedFileName == FileName && !x.IsDeleted).ToList();
            }
            private set { }
        }

PdfMergerViewModel.cs

        FileData fd = new FileData(new BatchData());
        void createOutputBackgroundWorker_DoWork(object sender, DoWorkEventArgs e)
        {
            using (StreamReader sr = File.OpenText("D:/data.txt"))
            {
                String input;

                while ((input = sr.ReadLine()) != null)
                {
                    string[] stringArray = input.Split(',');
                    for (int i = 0; i < stringArray.Count() - 1; i++)
                    {

                    }
                }
            }
        }

我需要将“fd”对象放在 for 循环中,并为“FileData.cs”中的每个属性分配值。我不知道如何分配价值。给我一个解决方案。谢谢。

“Data.Txt”文件中存在多行。“Data.txt”文件中的一行如下所示:

"Centerpoint - Arkansas (Fixed)","Centerpoint SO - Arkansas","{$DOCUMENT ID}","61||","{$BATCH ID}","32601","{$REGIONAL PREFIX}","E","CITY","CUSHING","DATE","05/25/1945","FUNCTION LOCATION","X-SVCS","KEY MAP","","ORDER NUMBER","","STATE","AR","STREET NUMBER","819","STREET NAME","E BROADWAY","UNIT NUMBER","","SEND TO GIS","X","{$PIPE BEFORE FILENAME}","||","\\HOUKOFAX01\Client\Centerpoint Arkansas\7_9_2012\32601\819 E BROADWAY.pdf"

以前使用“字典”。现在我们正在转向面向对象的方法。当存在字典项时使用以下代码。现在,我需要使用面向对象的方法来分配“FileData.cs”类中的值,而不是字典。使用字典项的代码:

            Dictionary<string, string> item = new Dictionary<string, string>();
            for (int i = 0; i < stringArray.Count() - 1; i++)
            {
                item.Add(RemoveQuote(stringArray[i]), RemoveQuote(stringArray[i + 1]));
                i++;
            }

我需要分配值而不是字典“fd”对象。我不知道如何分配价值。给我一个解决方案。谢谢。

4

3 回答 3

3

好吧,假设您在文本文件中有属性的名称和值,您可以尝试使用反射:

PropertyInfo propertyInfo = fd.GetType().GetProperty(propertyName);
propertyInfo.SetValue(fd, Convert.ChangeType(propertyValue, propertyInfo.PropertyType), null);

编辑:

如果您没有属性的名称,那么它至少应该以已知的顺序组织,否则无法动态设置属性。

如果它的顺序已知,您可以检索 FileData 属性并操作它们以适应与文本文件相同的顺序。

PropertyInfo[] propertyInfos = typeof(FileData).GetProperties(BindingFlags.Public);

//Possible Sort

foreach (PropertyInfo propertyInfo in propertyInfos)
{

}
于 2012-09-29T13:51:20.610 回答
0
FileData fd = new FileData(new BatchData());
void createOutputBackgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
    using (StreamReader sr = File.OpenText("D:/data.txt"))
    {
       String input;    
       while ((input = sr.ReadLine()) != null)
       {
            string[] stringArray = input.Split(',');
            PropertyInfo[] props = typeof (FileData).GetProperties();
            for (int i = 0; i < stringArray.Count() - 1; i++)
            {
                  props[i].SetValue(fd, stringArray[i]);
            }
       }
   }
}

PS 不要忘记添加对System.Reflection.

///////////////////////////////////////// ///////////////// 编辑 ///////////////////////// //////////////////////////////////

好吧,我认为最正确的解决方案是首先检查您的属性是什么类型,然后再进行分配。您可以使用if声明:

...
for (int i = 0; i < stringArray.Count() - 1; i++)
{
    if(props[i].GetValue(m) is DateTime)
    {
        props[i].SetValue(m, DateTime.Parse(stringArray[i]));
    }
    else
    {
        if(props[i].GetValue(m) is bool)
        {
            props[i].SetValue(m, stringArray[i].Equals("true", StringComparison.OrdinalIgnoreCase));
        }
        else
        {
             props[i].SetValue(m, stringArray[i]);
        }
    }
}
...

或者更优雅,特别是如果您的班级中有超过 3 种不同的类型,则switch

...
for (int i = 0; i < stringArray.Length; i++)
{
    object type = props[i].PropertyType;
    switch(type.ToString())
    {
         case "System.String": props[i].SetValue(m, stringArray[i]); break;
         case "System.DateTime": props[i].SetValue(m, DateTime.Parse(stringArray[i])); break;
         case "System.Boolean": props[i].SetValue(m, stringArray[i].Equals("true", StringComparison.OrdinalIgnoreCase));break;
     }
}
...

注意:如您所见,您应该使用type.ToString()语句,因为switch期望整数类型的值,props[i].GetType()或者props[i].PropertyType不是这样。

于 2012-09-29T14:12:03.030 回答
0

首先,您需要一个 List(Of FileData) 来保存从文件转换的每一行,而不仅仅是一个 FileData 对象。然后,您应该找到从 data.txt 中读取和滑动的行与 FileData 的单个属性之间的映射。

    List<FileData> listOfData = new List<FileData>();
    void createOutputBackgroundWorker_DoWork(object sender, DoWorkEventArgs e) 
    { 
        using (StreamReader sr = File.OpenText("D:/data.txt")) 
        { 
            String input; 

            while ((input = sr.ReadLine()) != null) 
            { 
                FileData fd = new FileData(new BatchData()); 
                string[] stringArray = input.Split(','); 
                for (int i = 0; i < stringArray.Length - 1; i+=2) 
                { 
                     switch(stringArray[i])
                     {
                          case "{$BATCH ID}":
                             fd.BatchID = stringArray[i+1];
                             break;
                          // Other properties follow ..... 
                          case ......
                     }
                } 
                listOfData.Add(fd);
            } 
        } 
    } 
于 2012-09-29T14:16:57.973 回答