C00225155-02/C00225155/MegaRobo.C00225155/Common/File_Operator.cs

439 lines
17 KiB
C#
Raw Normal View History

2026-04-13 09:12:49 +00:00
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
}
}