DynamicObjectWrapper.cs
/// <summary>
/// 动态object
/// </summary>
public class DynamicObjectWrapper : DynamicObject
{
private Dictionary<string, object> properties = new Dictionary<string, object>();
private Dictionary<string, Delegate> methods = new Dictionary<string, Delegate>();
public override bool TryGetMember(GetMemberBinder binder, out object result)
{
if (properties.ContainsKey(binder.Name))
{
result = properties[binder.Name];
return true;
}
else
{
result = null;
return false;
}
}
public override bool TrySetMember(SetMemberBinder binder, object value)
{
properties[binder.Name] = value;
return true;
}
public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result)
{
if (methods.ContainsKey(binder.Name))
{
result = methods[binder.Name].DynamicInvoke(args);
return true;
}
else
{
result = null;
return false;
}
}
/// <summary>
/// 添加属性
/// </summary>
/// <param name="propertyName"></param>
/// <param name="value"></param>
public void AddProperty(string propertyName, object value)
{
properties[propertyName] = value;
}
/// <summary>
/// 转换成object
/// </summary>
/// <returns></returns>
public object ToObject()
{
//properties
return properties;
}
public T ToType<T>()
{
return (T)Convert.ChangeType(properties, typeof(T));
}
public void AddMethod(string methodName, Delegate method)
{
methods[methodName] = method;
}
public void AddMethod<T>(string methodName, Action<T> method)
{
methods[methodName] = method;
}
public void AddMethod<T1, T2>(string methodName, Action<T1, T2> method)
{
methods[methodName] = method;
}
// 添加更多方法的重载,根据需要传入参数的数量和类型
}
使用案例
/// <summary>
/// 创建或更新
/// </summary>
/// <param name="type"></param>
/// <returns>新增数据</returns>
public int CreateOrUpdate(Models.Type type)
{
//type.TypeId;
//type.TypeContent;
//type.StatusId;
using (var db = new SqlConnection(sqlConnStr))
{
DynamicObjectWrapper obj = new DynamicObjectWrapper();
obj.AddProperty("TypeContent", type.TypeContent);
obj.AddProperty("StatusId",type.StatusId);
obj.AddProperty("CreatorId", 1);
string sql = "insert into type (TypeContent,StatusId,CreatorId) values (@TypeContent,@StatusId,@CreatorId);";
if (type.TypeId == 0)//插入
{
sql += "SELECT CAST(SCOPE_IDENTITY() as int)";
int typeId = db.Query<int>(sql, obj.ToObject()).FirstOrDefault<int>();
return typeId;
}
else
{
obj.AddProperty("TypeId", type.TypeId);
sql = "update type set TypeContent= @TypeContent where TypeId = @TypeId";
int ok = db.Execute(sql, obj.ToObject());
return ok;
}
}