sqlsugar/Src/Asp.Net/SqlSugar/Abstract/SaveableProvider/StorageableMethodInfo.cs

150 lines
5.3 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
namespace SqlSugar
{
public class StorageableMethodInfo
{
internal SqlSugarProvider Context { get; set; }
internal MethodInfo MethodInfo { get; set; }
internal object objectValue { get; set; }
public int ExecuteCommand()
{
if (Context == null) return 0;
object objectValue = null;
MethodInfo method = GetSaveMethod(ref objectValue);
if (method == null) return 0;
return (int)method.Invoke(objectValue, new object[] { });
}
public StorageableAsMethodInfo AsInsertable
{
get
{
var type = "AsInsertable";
return GetAs(type);
}
}
public StorageableAsMethodInfo AsUpdateable
{
get
{
var type = "AsUpdateable";
return GetAs(type);
}
}
private StorageableAsMethodInfo GetAs(string type)
{
object objectValue = null;
MethodInfo method = GetSaveMethod(ref objectValue);
if (method == null) return new StorageableAsMethodInfo(null);
method = objectValue.GetType().GetMethod("ToStorage");
objectValue = method.Invoke(objectValue, new object[] { });
StorageableAsMethodInfo result = new StorageableAsMethodInfo(type);
result.ObjectValue = objectValue;
result.Method = method;
return result;
}
private MethodInfo GetSaveMethod(ref object callValue)
{
if (objectValue == null)
return null;
callValue = MethodInfo.Invoke(Context, new object[] { objectValue });
return callValue.GetType().GetMyMethod("ExecuteCommand",0);
}
public StorageableMethodInfo ToStorage()
{
return this;
}
public StorageableSplitTableMethodInfo SplitTable()
{
object objectValue = null;
MethodInfo method = GetSaveMethod(ref objectValue);
if (method == null) return new StorageableSplitTableMethodInfo(null);
method = objectValue.GetType().GetMethod("SplitTable");
objectValue = method.Invoke(objectValue, new object[] { });
StorageableSplitTableMethodInfo result = new StorageableSplitTableMethodInfo(null);
result.ObjectValue = objectValue;
result.Method = method;
return result;
}
public StorageableSplitTableMethodInfo AS(string tableName)
{
object objectValue = null;
MethodInfo method = GetSaveMethod(ref objectValue);
if (method == null) return new StorageableSplitTableMethodInfo(null);
method = objectValue.GetType().GetMyMethod("As",1);
objectValue = method.Invoke(objectValue, new object[] { tableName });
StorageableSplitTableMethodInfo result = new StorageableSplitTableMethodInfo(null);
result.ObjectValue = objectValue;
result.Method = method;
return result;
}
}
public class StorageableAsMethodInfo
{
private StorageableAsMethodInfo() { }
private string type;
public StorageableAsMethodInfo(string type)
{
this.type = type;
}
internal object ObjectValue { get; set; }
internal MethodInfo Method { get; set; }
public int ExecuteCommand()
{
if (type == null) return 0;
PropertyInfo property = ObjectValue.GetType().GetProperty(type);
var value = property.GetValue(ObjectValue);
var newObj= value.GetType().GetMethod("ExecuteCommand").Invoke(value, new object[] { });
return (int)newObj;
}
public StorageableCommonMethodInfo IgnoreColumns(params string[] ignoreColumns)
{
PropertyInfo property = ObjectValue?.GetType().GetProperty(type);
var value = property?.GetValue(ObjectValue);
var newObj = value?.GetType().GetMyMethod("IgnoreColumns", 1, typeof(string[])).Invoke(value, new object[] { ignoreColumns });
StorageableCommonMethodInfo result = new StorageableCommonMethodInfo();
result.Value = newObj;
return result;
}
}
public class StorageableCommonMethodInfo
{
public object Value { get; set; }
public int ExecuteCommand()
{
if(Value == null) return 0;
var newObj = Value.GetType().GetMethod("ExecuteCommand").Invoke(Value, new object[] { });
return (int)newObj;
}
}
public class StorageableSplitTableMethodInfo
{
private StorageableSplitTableMethodInfo() { }
private string type;
public StorageableSplitTableMethodInfo(string type)
{
this.type = type;
}
internal object ObjectValue { get; set; }
internal MethodInfo Method { get; set; }
public int ExecuteCommand()
{
var newObj = ObjectValue.GetType().GetMethod("ExecuteCommand").Invoke(ObjectValue, new object[] { });
return (int)newObj;
}
}
}