439 lines
17 KiB
C#
439 lines
17 KiB
C#
|
|
using Common.Models;
|
|||
|
|
using Microsoft.Win32;
|
|||
|
|
using Newtonsoft;
|
|||
|
|
using Newtonsoft.Json;
|
|||
|
|
using System.Collections;
|
|||
|
|
using System.Collections.Generic;
|
|||
|
|
using System.Collections.ObjectModel;
|
|||
|
|
using System.IO;
|
|||
|
|
using System.Linq;
|
|||
|
|
using System.Reflection;
|
|||
|
|
using System.Runtime.Serialization;
|
|||
|
|
using System.Runtime.Serialization.Formatters.Binary;
|
|||
|
|
using System.Windows;
|
|||
|
|
using System.Windows.Media;
|
|||
|
|
using System.Xml.Serialization;
|
|||
|
|
|
|||
|
|
namespace Common
|
|||
|
|
{
|
|||
|
|
public class File_Operator
|
|||
|
|
{
|
|||
|
|
private static readonly object _lock = new object();
|
|||
|
|
|
|||
|
|
public static T Xml_Serialize<T>(string strFile, bool bSave, T param, out bool bReadOK) where T : class
|
|||
|
|
{
|
|||
|
|
lock (_lock)
|
|||
|
|
{
|
|||
|
|
bReadOK = true;
|
|||
|
|
XmlSerializer xs = null;
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD> BaseBottleBox <20><><EFBFBD>ϣ<EFBFBD><CFA3><EFBFBD>ʽָ<CABD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
if (typeof(T) == typeof(ProjectProperty))
|
|||
|
|
{
|
|||
|
|
Type[] extraTypes = new Type[]
|
|||
|
|
{
|
|||
|
|
typeof(BaseBottleBox),
|
|||
|
|
typeof(SampleBottleBoxModel),
|
|||
|
|
typeof(SourceLiquidBottleBoxModel),
|
|||
|
|
typeof(SourcePowderBottleBoxModel),
|
|||
|
|
typeof(SourcePowderBottleBoxModel_125ml),
|
|||
|
|
typeof(TipBoxModel),
|
|||
|
|
typeof(SourcePowderBottleModel),
|
|||
|
|
typeof(TipHeadItem)
|
|||
|
|
};
|
|||
|
|
xs = new XmlSerializer(typeof(ProjectProperty), extraTypes);
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
xs = new XmlSerializer(param.GetType());
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
// ʹ<><CAB9> using <20>Զ<EFBFBD><D4B6>ͷ<EFBFBD><CDB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դй©<D0B9><C2A9>
|
|||
|
|
if (bSave)
|
|||
|
|
{
|
|||
|
|
using (Stream stream = new FileStream(strFile, FileMode.Create, FileAccess.Write, FileShare.Read))
|
|||
|
|
{
|
|||
|
|
xs.Serialize(stream, param);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
if (File.Exists(strFile))
|
|||
|
|
{
|
|||
|
|
using (Stream stream = new FileStream(strFile, FileMode.Open, FileAccess.Read, FileShare.Read))
|
|||
|
|
{
|
|||
|
|
param = xs.Deserialize(stream) as T;
|
|||
|
|
}
|
|||
|
|
return param;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
// <20>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>л<EFBFBD>Ĭ<EFBFBD><C4AC>ֵ
|
|||
|
|
using (Stream stream = new FileStream(strFile, FileMode.Create, FileAccess.Write, FileShare.Read))
|
|||
|
|
{
|
|||
|
|
xs.Serialize(stream, param);
|
|||
|
|
}
|
|||
|
|
// <20><><EFBFBD>¶<EFBFBD>ȡ
|
|||
|
|
using (Stream stream = new FileStream(strFile, FileMode.Open, FileAccess.Read, FileShare.Read))
|
|||
|
|
{
|
|||
|
|
param = xs.Deserialize(stream) as T;
|
|||
|
|
}
|
|||
|
|
return param;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
catch (Exception ex)
|
|||
|
|
{
|
|||
|
|
bReadOK = false;
|
|||
|
|
MessageBox.Show($"<22><><EFBFBD>л<EFBFBD>ʧ<EFBFBD>ܣ<EFBFBD>{ex.Message}\n{ex.StackTrace}", "<22><><EFBFBD><EFBFBD>");
|
|||
|
|
}
|
|||
|
|
return null;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// XML<4D>ļ<EFBFBD><C4BC><EFBFBD>д
|
|||
|
|
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ò<EFBFBD><C3B2><EFBFBD> bReadOK==falseΪ<65><CEAA><EFBFBD><EFBFBD><EFBFBD>쳣
|
|||
|
|
/// </summary>
|
|||
|
|
/// <typeparam name="T"><3E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD></typeparam>
|
|||
|
|
/// <param name="strFile"><3E><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>·<EFBFBD><C2B7><EFBFBD><EFBFBD></param>
|
|||
|
|
/// <param name="bSave">true:<3A><><EFBFBD>棻false:<3A><>ȡ</param>
|
|||
|
|
/// <param name="param">Ҫ<><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>л<EFBFBD><D0BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>л<EFBFBD><D0BB>Ķ<EFBFBD><C4B6><EFBFBD>ʵ<EFBFBD><CAB5></param>
|
|||
|
|
/// <param name="bReadOK"><3E>Ƿ<EFBFBD><C7B7><EFBFBD>д<EFBFBD>ɹ<EFBFBD><C9B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>쳣</param>
|
|||
|
|
/// <returns><3E><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD></returns>
|
|||
|
|
//public static T Xml_Serialize<T>(string strFile, bool bSave, T param, out bool bReadOK) where T : class
|
|||
|
|
//{
|
|||
|
|
// lock (_lock)
|
|||
|
|
// {
|
|||
|
|
// bReadOK = true;
|
|||
|
|
// XmlSerializer xs = new XmlSerializer(param.GetType());
|
|||
|
|
// try
|
|||
|
|
// {
|
|||
|
|
// if (bSave)
|
|||
|
|
// {
|
|||
|
|
// //<2F><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB> FileStream <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> FileMode.Create ģʽ<C4A3><CABD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD>ݡ<EFBFBD>
|
|||
|
|
// //ʹ<><CAB9> xs.Serialize <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> param <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>л<EFBFBD>Ϊ XML <20><><EFBFBD>ݣ<EFBFBD><DDA3><EFBFBD>д<EFBFBD><D0B4><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>
|
|||
|
|
// //<2F>ر<EFBFBD><D8B1>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
// Stream stream = new FileStream(strFile, FileMode.Create, FileAccess.Write, FileShare.Read);
|
|||
|
|
// xs.Serialize(stream, param);
|
|||
|
|
// stream.Close();
|
|||
|
|
// }
|
|||
|
|
// else
|
|||
|
|
// {
|
|||
|
|
// //<2F><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD>ڡ<EFBFBD>
|
|||
|
|
// //<2F><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD>ڣ<EFBFBD><DAA3><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB> FileStream <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> FileMode.Open ģʽ<C4A3><CABD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڶ<EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD>ݡ<EFBFBD>
|
|||
|
|
// //ʹ<><CAB9> xs.Deserialize <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC>е<EFBFBD> XML <20><><EFBFBD>ݷ<EFBFBD><DDB7><EFBFBD><EFBFBD>л<EFBFBD>Ϊ T <20><><EFBFBD>͵Ķ<CDB5><C4B6><EFBFBD><F3A3ACB2><EFBFBD>ֵ<EFBFBD><D6B5> param<61><6D>
|
|||
|
|
// //<2F>ر<EFBFBD><D8B1>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ط<EFBFBD><D8B7><EFBFBD><EFBFBD>л<EFBFBD><D0BB><EFBFBD><EFBFBD>Ķ<EFBFBD><C4B6><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
|
|||
|
|
// if (File.Exists(strFile))
|
|||
|
|
// {
|
|||
|
|
// Stream stream = new FileStream(strFile, FileMode.Open, FileAccess.Read, FileShare.Read);
|
|||
|
|
// param = xs.Deserialize(stream) as T;
|
|||
|
|
// stream.Close();
|
|||
|
|
// return param;
|
|||
|
|
// }
|
|||
|
|
// else
|
|||
|
|
// {
|
|||
|
|
// //<2F><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڣ<EFBFBD><DAA3>ȴ<EFBFBD><C8B4><EFBFBD>һ<EFBFBD><D2BB> FileStream <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> FileMode.Create ģʽ<C4A3><CABD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD> param <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>л<EFBFBD>Ϊ XML <20><><EFBFBD>ݲ<EFBFBD>д<EFBFBD><D0B4><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>
|
|||
|
|
// //<2F>ٴδ<D9B4><CEB4><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD>е<EFBFBD> XML <20><><EFBFBD>ݽ<EFBFBD><DDBD>з<EFBFBD><D0B7><EFBFBD><EFBFBD>л<EFBFBD><D0BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ط<EFBFBD><D8B7><EFBFBD><EFBFBD>л<EFBFBD><D0BB><EFBFBD><EFBFBD>Ķ<EFBFBD><C4B6><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
// Stream stream = new FileStream(strFile, FileMode.Create, FileAccess.Write, FileShare.Read);
|
|||
|
|
// xs.Serialize(stream, param);
|
|||
|
|
// stream.Close();
|
|||
|
|
|
|||
|
|
// stream = new FileStream(strFile, FileMode.Open, FileAccess.Read, FileShare.Read);
|
|||
|
|
// param = xs.Deserialize(stream) as T;
|
|||
|
|
// stream.Close();
|
|||
|
|
// return param;
|
|||
|
|
// }
|
|||
|
|
// }
|
|||
|
|
// }
|
|||
|
|
// catch (Exception ex)
|
|||
|
|
// {
|
|||
|
|
// bReadOK = false;
|
|||
|
|
// MessageBox.Show(ex.Message);
|
|||
|
|
// }
|
|||
|
|
// return null;
|
|||
|
|
// }
|
|||
|
|
//}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// ͨ<><CDA8><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>Ѱ<EFBFBD><D1B0>ͬĿ¼<C4BF>µ<EFBFBD><C2B5><EFBFBD><EFBFBD><EFBFBD>ͬ<EFBFBD><CDAC><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="file"><3E>ļ<EFBFBD><C4BC>ľ<EFBFBD><C4BE><EFBFBD>·<EFBFBD><C2B7><EFBFBD><EFBFBD></param>
|
|||
|
|
public static List<string> GetFile(string file)
|
|||
|
|
{
|
|||
|
|
List<string> listFile = new List<string>();
|
|||
|
|
if (!string.IsNullOrEmpty(file) && File.Exists(file))
|
|||
|
|
{
|
|||
|
|
int index = file.LastIndexOf("\\");
|
|||
|
|
if (-1 == index) return null;
|
|||
|
|
string path = file.Substring(0, index);//<2F>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>·<EFBFBD><C2B7>
|
|||
|
|
string name = file.Substring(index);//<2F>ļ<EFBFBD><C4BC><EFBFBD>
|
|||
|
|
string postfix = "";//ȡ<><C8A1><EFBFBD><EFBFBD><EFBFBD><D7BA>
|
|||
|
|
if (name.Contains("."))
|
|||
|
|
{
|
|||
|
|
postfix = name.Substring(name.LastIndexOf('.'));//<2F><><EFBFBD><EFBFBD> .txt
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
return null;
|
|||
|
|
}
|
|||
|
|
string[] files = null;
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
files = Directory.GetFiles(path);
|
|||
|
|
}
|
|||
|
|
catch (Exception ex)
|
|||
|
|
{
|
|||
|
|
MessageBox.Show(ex.Message);
|
|||
|
|
return null;
|
|||
|
|
}
|
|||
|
|
foreach (var item in files)
|
|||
|
|
{
|
|||
|
|
int nIndex = item.IndexOf(postfix);
|
|||
|
|
if (nIndex != -1)
|
|||
|
|
{
|
|||
|
|
listFile.Add(item);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return listFile;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
#region <EFBFBD><EFBFBD>ע<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>д
|
|||
|
|
//public static void CreatRegistryPath(string strPathName)
|
|||
|
|
//{
|
|||
|
|
// try
|
|||
|
|
// {
|
|||
|
|
// RegistryKey key = Registry.LocalMachine;
|
|||
|
|
// //RegistryKey software = key.CreateSubKey("software\\test");
|
|||
|
|
// RegistryKey software = key.CreateSubKey("software\\" + strPathName);
|
|||
|
|
// key.Close();
|
|||
|
|
// }
|
|||
|
|
// catch (Exception ex)
|
|||
|
|
// {
|
|||
|
|
// MessageBox.Show("<22><>ע<EFBFBD><D7A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>·<EFBFBD><C2B7>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD>쳣!" + ex.Message);
|
|||
|
|
// }
|
|||
|
|
//}
|
|||
|
|
|
|||
|
|
//public static void DeleteRegistryPath(string strPathName)
|
|||
|
|
//{
|
|||
|
|
// try
|
|||
|
|
// {
|
|||
|
|
// RegistryKey key = Registry.LocalMachine;
|
|||
|
|
// //key.DeleteSubKey("software\\test", true);
|
|||
|
|
// key.DeleteSubKey("software\\" + strPathName, true);
|
|||
|
|
// key.Close();
|
|||
|
|
// }
|
|||
|
|
// catch (Exception ex)
|
|||
|
|
// {
|
|||
|
|
// MessageBox.Show("<22><>ע<EFBFBD><D7A2><EFBFBD><EFBFBD>ɾ<EFBFBD><C9BE>·<EFBFBD><C2B7>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD>쳣!" + ex.Message);
|
|||
|
|
// }
|
|||
|
|
//}
|
|||
|
|
|
|||
|
|
//public static void SetRegistryValue(string strPathName, string strKey, string strValue)
|
|||
|
|
//{
|
|||
|
|
// try
|
|||
|
|
// {
|
|||
|
|
// RegistryKey key = Registry.LocalMachine;
|
|||
|
|
// RegistryKey software = key.OpenSubKey("software\\" + strPathName, true);
|
|||
|
|
// //software.SetValue("test", "<22><><EFBFBD><EFBFBD>");
|
|||
|
|
// software.SetValue(strKey, strValue);
|
|||
|
|
// key.Close();
|
|||
|
|
// }
|
|||
|
|
// catch (Exception ex)
|
|||
|
|
// {
|
|||
|
|
// MessageBox.Show("<22><>ע<EFBFBD><D7A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ü<EFBFBD>ֵʱ<D6B5><CAB1><EFBFBD><EFBFBD><EFBFBD>쳣!" + ex.Message);
|
|||
|
|
// }
|
|||
|
|
//}
|
|||
|
|
|
|||
|
|
//public static string GetRegistryValue(string strPathName, string strKey)
|
|||
|
|
//{
|
|||
|
|
// try
|
|||
|
|
// {
|
|||
|
|
// RegistryKey Key = Registry.LocalMachine;
|
|||
|
|
// RegistryKey myreg = Key.OpenSubKey("software\\" + strPathName, true);
|
|||
|
|
// //info = myreg.GetValue("test").ToString();
|
|||
|
|
// string strValue = myreg.GetValue(strKey).ToString();
|
|||
|
|
// myreg.Close();
|
|||
|
|
// return strValue;
|
|||
|
|
// }
|
|||
|
|
// catch (Exception ex)
|
|||
|
|
// {
|
|||
|
|
// MessageBox.Show("<22><>ע<EFBFBD><D7A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡֵʱ<D6B5><CAB1><EFBFBD><EFBFBD><EFBFBD>쳣!" + ex.Message);
|
|||
|
|
// return "";
|
|||
|
|
// }
|
|||
|
|
//}
|
|||
|
|
|
|||
|
|
//public static void DeleteRegistryKey(string strPathName, string strKey)
|
|||
|
|
//{
|
|||
|
|
// try
|
|||
|
|
// {
|
|||
|
|
// RegistryKey delKey = Registry.LocalMachine.OpenSubKey("Software\\" + strPathName, true);
|
|||
|
|
// //delKey.DeleteValue("test");
|
|||
|
|
// delKey.DeleteValue(strKey);
|
|||
|
|
// delKey.Close();
|
|||
|
|
// }
|
|||
|
|
// catch (Exception ex)
|
|||
|
|
// {
|
|||
|
|
// MessageBox.Show("<22><>ע<EFBFBD><D7A2><EFBFBD><EFBFBD>ɾ<EFBFBD><C9BE><EFBFBD><EFBFBD>ֵʱ<D6B5><CAB1><EFBFBD><EFBFBD><EFBFBD>쳣!" + ex.Message);
|
|||
|
|
// }
|
|||
|
|
//}
|
|||
|
|
#endregion
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
#region <EFBFBD><EFBFBD><EFBFBD>ȿ<EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
public static T DeepCopy<T>(T obj)
|
|||
|
|
{
|
|||
|
|
if (obj == null) return default;
|
|||
|
|
//var json = JsonConvert.SerializeObject(obj);
|
|||
|
|
//return JsonConvert.DeserializeObject<T>(json);
|
|||
|
|
|
|||
|
|
var settings = new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.All };
|
|||
|
|
string json = JsonConvert.SerializeObject(obj, settings);
|
|||
|
|
return JsonConvert.DeserializeObject<T>(json, settings);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
[Obsolete("<22><><EFBFBD>ã<EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>DeepCopy<70><79><EFBFBD><EFBFBD>")]
|
|||
|
|
public static T DeepCopy_1<T>(T obj)
|
|||
|
|
{
|
|||
|
|
if (obj == null) return default;
|
|||
|
|
|
|||
|
|
Type actualType = obj.GetType();
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD>ͺ<EFBFBD><CDBA>ַ<EFBFBD><D6B7><EFBFBD>
|
|||
|
|
// <20><><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD>ͺ<EFBFBD><CDBA>ַ<EFBFBD><D6B7><EFBFBD>
|
|||
|
|
if (actualType.IsValueType || actualType == typeof(string))
|
|||
|
|
return obj;
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
if (actualType.IsArray)
|
|||
|
|
{
|
|||
|
|
var elementType = typeof(T).GetElementType();
|
|||
|
|
var sourceArray = (Array)(object)obj;
|
|||
|
|
var copiedArray = Array.CreateInstance(elementType, sourceArray.Length);
|
|||
|
|
for (int i = 0; i < sourceArray.Length; i++)
|
|||
|
|
{
|
|||
|
|
copiedArray.SetValue(DeepCopy((dynamic)sourceArray.GetValue(i)), i);
|
|||
|
|
}
|
|||
|
|
return (T)(object)copiedArray;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϣ<EFBFBD><CFA3><EFBFBD> List, ObservableCollection<6F><6E>
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϣ<EFBFBD><CFA3><EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD>Ӵ<EFBFBD><D3B4><EFBFBD>Ŀ<EFBFBD><C4BF><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD><CDA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>
|
|||
|
|
if (typeof(IEnumerable).IsAssignableFrom(actualType) && actualType != typeof(string))
|
|||
|
|
{
|
|||
|
|
return DeepCopyCollection<T>(obj);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD><F3A3A8BA><EFBFBD><EFBFBD>ģ<DEB8>
|
|||
|
|
// <20>ؼ<EFBFBD><D8BC><EFBFBD>2<EFBFBD><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5><EFBFBD><EFBFBD><EFBFBD>͡<EFBFBD><CDA1><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> T <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD>
|
|||
|
|
object copy = Activator.CreateInstance(actualType);
|
|||
|
|
// <20>ؼ<EFBFBD><D8BC><EFBFBD>3<EFBFBD><33><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֶΣ<D6B6><CEA3><EFBFBD><EFBFBD><EFBFBD>˽<EFBFBD><CBBD><EFBFBD>ֶ<EFBFBD>+<2B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֶΣ<D6B6>
|
|||
|
|
FieldInfo[] fields = actualType.GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
|
|||
|
|
|
|||
|
|
foreach (var field in fields)
|
|||
|
|
{
|
|||
|
|
if (field.IsStatic) continue; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̬<EFBFBD>ֶ<EFBFBD>
|
|||
|
|
|
|||
|
|
var value = field.GetValue(obj);
|
|||
|
|
// <20>ݹ<EFBFBD><DDB9><EFBFBD><EEBFBD><EFBFBD>ֶ<EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԭ<EFBFBD><EFBFBD><DFBC><EFBFBD>
|
|||
|
|
var copiedValue = DeepCopy((dynamic)value);
|
|||
|
|
field.SetValue(copy, copiedValue);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// ǿ<><C7BF>ת<EFBFBD><D7AA>Ϊ T<><54><EFBFBD><EFBFBD>Ϊʵ<CEAA><CAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> T <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>࣬ת<E0A3AC><D7AA><EFBFBD><EFBFBD>ȫ<EFBFBD><C8AB>
|
|||
|
|
return (T)copy;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// ר<>Ŵ<EFBFBD><C5B4><EFBFBD> ObservableCollection <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԣ<EFBFBD>֧<EFBFBD><D6A7>ֻ<EFBFBD><D6BB><EFBFBD><EFBFBD><EFBFBD>ԣ<EFBFBD>
|
|||
|
|
/// </summary>
|
|||
|
|
private static void DeepCopyObservableCollectionProperty(PropertyInfo property, object sourceObj, object targetObj)
|
|||
|
|
{
|
|||
|
|
// <20><>ȡԴ<C8A1><D4B4><EFBFBD>Ϻ<EFBFBD>Ԫ<EFBFBD><D4AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
var sourceCollection = property.GetValue(sourceObj) as IEnumerable;
|
|||
|
|
var elementType = property.PropertyType.GetGenericArguments()[0];
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD>µ<EFBFBD> ObservableCollection ʵ<><CAB5><EFBFBD><EFBFBD>ƥ<EFBFBD><C6A5>ԭ<EFBFBD><D4AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD>
|
|||
|
|
var targetCollection = Activator.CreateInstance(property.PropertyType) as IList;
|
|||
|
|
if (targetCollection == null)
|
|||
|
|
throw new InvalidOperationException($"<22><EFBFBD><DEB7><EFBFBD><EFBFBD><EFBFBD> {property.PropertyType.Name} ʵ<><CAB5>");
|
|||
|
|
|
|||
|
|
// <20><EFBFBD><EEBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD>ز<EFBFBD><D8B2><EFBFBD><EFBFBD>ӵ<EFBFBD><D3B5>¼<EFBFBD><C2BC><EFBFBD>
|
|||
|
|
foreach (var item in sourceCollection)
|
|||
|
|
{
|
|||
|
|
var copiedItem = DeepCopy((dynamic)item);
|
|||
|
|
targetCollection.Add(copiedItem);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// <20><>Ŀ<EFBFBD><C4BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD>ֱ<EFBFBD><D6B1> SetValue<75><65>ֻ<EFBFBD><D6BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8><EFBFBD>ײ<EFBFBD><D7B2>ֶθ<D6B6>ֵ
|
|||
|
|
if (property.CanWrite)
|
|||
|
|
{
|
|||
|
|
property.SetValue(targetObj, targetCollection);
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
// ƥ<><C6A5>ֻ<EFBFBD><D6BB><EFBFBD><EFBFBD><EFBFBD>Եĵײ<C4B5><D7B2>ֶΣ<D6B6><CEA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>淶<EFBFBD><E6B7B6>_propertyName <20><> m_propertyName<6D><65>
|
|||
|
|
var fieldName = $"_{char.ToLower(property.Name[0])}{property.Name.Substring(1)}";
|
|||
|
|
var field = targetObj.GetType().GetField(fieldName, BindingFlags.NonPublic | BindingFlags.Instance);
|
|||
|
|
|
|||
|
|
// <20><>δƥ<CEB4>䵽<EFBFBD><E4B5BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> mPropertyName <20>淶
|
|||
|
|
if (field == null)
|
|||
|
|
{
|
|||
|
|
fieldName = $"m{property.Name}";
|
|||
|
|
field = targetObj.GetType().GetField(fieldName, BindingFlags.NonPublic | BindingFlags.Instance);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (field != null && field.FieldType == property.PropertyType)
|
|||
|
|
{
|
|||
|
|
field.SetValue(targetObj, targetCollection);
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
throw new InvalidOperationException($"<22><EFBFBD><DEB7><EFBFBD>ֻ<EFBFBD><D6BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD> {property.DeclaringType.Name}.{property.Name} <20><>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֶ<EFBFBD><D6B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԥ<EFBFBD>ڣ<EFBFBD>{fieldName}<7D><>");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20>Ż<EFBFBD><C5BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EEBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD>Ӵ<EFBFBD><D3B4><EFBFBD>Ŀ<EFBFBD><C4BF><EFBFBD><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC>ϣ<EFBFBD><CFA3><EFBFBD><EFBFBD><EFBFBD> List <20><>ת
|
|||
|
|
/// </summary>
|
|||
|
|
private static T DeepCopyCollection<T>(T sourceCollection)
|
|||
|
|
{
|
|||
|
|
var sourceType = typeof(T);
|
|||
|
|
var elementType = sourceType.IsGenericType ? sourceType.GetGenericArguments()[0] : typeof(object);
|
|||
|
|
|
|||
|
|
// ֱ<>Ӵ<EFBFBD><D3B4><EFBFBD>Ŀ<EFBFBD><C4BF><EFBFBD><EFBFBD><EFBFBD>͵ļ<CDB5><C4BC><EFBFBD>ʵ<EFBFBD><CAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ObservableCollection<SampleBottleModel><3E><>
|
|||
|
|
var targetCollection = Activator.CreateInstance(sourceType) as IList;
|
|||
|
|
if (targetCollection == null)
|
|||
|
|
throw new InvalidOperationException($"<22><EFBFBD><DEB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> {sourceType.Name} ʵ<><CAB5>");
|
|||
|
|
|
|||
|
|
// <20><EFBFBD><EEBFBD>ÿ<EFBFBD><C3BF>Ԫ<EFBFBD>ز<EFBFBD><D8B2><EFBFBD><EFBFBD>ӵ<EFBFBD><D3B5>¼<EFBFBD><C2BC><EFBFBD>
|
|||
|
|
foreach (var item in (IEnumerable)sourceCollection)
|
|||
|
|
{
|
|||
|
|
var copiedItem = DeepCopy((dynamic)item);
|
|||
|
|
targetCollection.Add(copiedItem);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return (T)targetCollection;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public static ObservableCollection<T> DeepCopyObservableCollection<T>(ObservableCollection<T> source)
|
|||
|
|
{
|
|||
|
|
// <20><><EFBFBD>л<EFBFBD>Ϊ JSON <20>ַ<EFBFBD><D6B7><EFBFBD>
|
|||
|
|
var json = JsonConvert.SerializeObject(source);
|
|||
|
|
// <20><> JSON <20>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>л<EFBFBD>Ϊ<EFBFBD>¶<EFBFBD><C2B6><EFBFBD>
|
|||
|
|
return JsonConvert.DeserializeObject<ObservableCollection<T>>(json);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
#endregion
|
|||
|
|
}
|
|||
|
|
}
|