1
This commit is contained in:
174
Core/Property/Property.cs
Normal file
174
Core/Property/Property.cs
Normal file
@@ -0,0 +1,174 @@
|
||||
using System;
|
||||
using System.Linq;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
using Microsoft.SqlServer.Server;
|
||||
using System.IO;
|
||||
|
||||
namespace BITKit
|
||||
{
|
||||
/// <summary>
|
||||
/// 属性接口,用于序列化引用
|
||||
/// </summary>
|
||||
public interface IProperty
|
||||
{
|
||||
|
||||
}
|
||||
/// <summary>
|
||||
/// 属性接口
|
||||
/// GetOrCreate(√)
|
||||
/// GetOrAdd(√)
|
||||
/// TryGet(√)
|
||||
/// TryRemove(√)
|
||||
/// TrySet(√)
|
||||
/// GetProperties(√)
|
||||
/// </summary>
|
||||
public interface IPropertable: IBinarySerialize
|
||||
{
|
||||
/// <summary>
|
||||
/// 是否拥有属性
|
||||
/// </summary>
|
||||
bool Contains<T>();
|
||||
/// <summary>
|
||||
/// 获取或创建属性
|
||||
/// </summary>
|
||||
T GetOrCreateProperty<T>();
|
||||
/// <summary>
|
||||
/// 获取或通过工厂方法添加属性
|
||||
/// </summary>
|
||||
T GetOrAddProperty<T>(Func<T> addFactory);
|
||||
/// <summary>
|
||||
/// 尝试获取属性
|
||||
/// </summary>
|
||||
bool TryGetProperty<T>(out T value);
|
||||
/// <summary>
|
||||
/// 尝试移除属性
|
||||
/// </summary>
|
||||
bool TryRemoveProperty<T>();
|
||||
/// <summary>
|
||||
/// 尝试设置属性
|
||||
/// </summary>
|
||||
bool TrySetProperty<T>(T value);
|
||||
/// <summary>
|
||||
/// 获取所有属性
|
||||
/// </summary>
|
||||
object[] GetProperties();
|
||||
/// <summary>
|
||||
/// 清除所有属性
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
bool ClearProperties();
|
||||
/// <summary>
|
||||
/// 从其他对象复制属性
|
||||
/// </summary>
|
||||
/// <param name="propertable"></param>
|
||||
/// <returns></returns>
|
||||
bool CopyPropertiesFrom(IPropertable propertable);
|
||||
}
|
||||
public class Property : IPropertable
|
||||
{
|
||||
public Property() { }
|
||||
public Property(IEnumerable<object> factory)
|
||||
{
|
||||
foreach (var x in factory)
|
||||
{
|
||||
properties.Add(x.GetType().FullName, x);
|
||||
}
|
||||
}
|
||||
Dictionary<string, object> properties=new();
|
||||
public T GetProperty<T>()
|
||||
{
|
||||
return (T)properties[typeof(T).FullName];
|
||||
}
|
||||
public void SetProperty<T>(T value)
|
||||
{
|
||||
properties.Insert(typeof(T).FullName, value);
|
||||
}
|
||||
public bool Contains<T>()
|
||||
{
|
||||
return properties.ContainsKey(typeof(T).FullName);
|
||||
}
|
||||
|
||||
public T GetOrCreateProperty<T>()
|
||||
{
|
||||
return GetOrAddProperty(Activator.CreateInstance<T>);
|
||||
}
|
||||
public T GetOrAddProperty<T>(Func<T> addFactory)
|
||||
{
|
||||
if (properties.TryGetValue(typeof(T).FullName, out var x))
|
||||
{
|
||||
return (T)x;
|
||||
}
|
||||
else
|
||||
{
|
||||
properties.Add(typeof(T).FullName, x = addFactory.Invoke());
|
||||
return (T)x;
|
||||
}
|
||||
}
|
||||
public bool TryGetProperty<T>(out T value)
|
||||
{
|
||||
if (properties.TryGetValue(typeof(T).FullName, out var x))
|
||||
{
|
||||
value = (T)x;
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
value=default(T);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
public bool TryRemoveProperty<T>()
|
||||
{
|
||||
if(properties.TryGetValue(typeof(T).FullName, out var x))
|
||||
{
|
||||
properties.Remove(typeof(T).Name);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
public bool TrySetProperty<T>(T value)
|
||||
{
|
||||
if (properties.TryGetValue(typeof(T).FullName, out var x))
|
||||
{
|
||||
properties[typeof(T).FullName] = value;
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
public object[] GetProperties()=>properties.Values.ToArray();
|
||||
|
||||
public void Read(BinaryReader r)
|
||||
{
|
||||
foreach (var x in properties)
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
public void Write(BinaryWriter w)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public bool ClearProperties()
|
||||
{
|
||||
properties.Clear();
|
||||
return true;
|
||||
}
|
||||
|
||||
public bool CopyPropertiesFrom(IPropertable propertable)
|
||||
{
|
||||
ClearProperties();
|
||||
foreach (var x in propertable.GetProperties())
|
||||
{
|
||||
properties.Add(x.GetType().FullName, x);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user