我正試圖設計一個進程來提取轉換加載操作。我想在我的管道中使用ExpandoObject,以便輕鬆地將列添加到我的數據流中。基本上,我從某種數據源讀取數據,將其轉換爲動態數據並將其返回給變換管道,這些變換可以基於現有屬性或其他屬性添加屬性,然後將數據流送入數據庫。使用DynamicObject存儲類型信息
我遇到的問題是我需要添加到我的expando對象的所有屬性的類型信息,即使我添加了Nullable類型。如果Nullable類型因值的裝箱而爲空,則這會丟失。我需要這些類型信息,以便在我的管道結束時,我可以通過枚舉ExpandoObjects實現一個datareader並將數據流式傳輸到數據庫中。
我希望SetMemberBinder.ReturnType屬性可以幫助我,但它似乎返回一個對象。
這裏的一些示例代碼:
using System;
using System.Collections.Generic;
using System.Dynamic;
using Xunit
namespace Whanger
{
public class MyExpando : DynamicObject
{
Dictionary<string, object> properties = new Dictionary<string, object>();
Dictionary<string, Type> propertyTypes = new Dictionary<string, Type>();
public Dictionary<string, Type> Types
{
get
{
return propertyTypes;
}
}
public Dictionary<string, object> Values
{
get
{
return properties;
}
}
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;
propertyTypes[binder.Name] = binder.ReturnType;//always object :(
return true;
}
public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result)
{
dynamic method = properties[binder.Name];
result = method(args[0].ToString(), args[1].ToString());
return true;
}
}
public class MyExpandoTests
{
[Fact]
public void CanAddDynamicMembers()
{
dynamic obj = new MyExpando();
obj.Name = "Wibble";
obj.Value = 2;
Assert.Equal(obj.Name, "Wibble");
Assert.Equal(obj.Value, 2);
}
[Fact]
public void CanMaintainType()
{
dynamic obj = new MyExpando();
int? nullableInt = null;
obj.NullInt = nullableInt;
obj.Name = "Wibble";
Assert.Equal(obj.Name, "Wibble");
Assert.Null(obj.NullInt);
//fails
Assert.Equal(typeof(int?), ((MyExpando)obj).Types["NullInt"]);
}
}
}
有沒有辦法找出從TrySetMember類型?我想知道是否有某種方法可以使用某種表達樹魔術?
如果任何人有任何偉大的想法,我很樂意聽到他們。除了可爲空的類型外,它們都運行良好,但它們是數據庫操作的關鍵。
謝謝
雖然未明確提及,但可能會引起您的興趣:['System.Dynamic.ExpandObject'](http://msdn.microsoft.com/zh-cn/library/system.dynamic.expandoobject%28v=vs。 110%29.aspx) – heltonbiker 2014-11-03 23:51:24
'ExpandoObject'只是一個對象字典,可空結構也會被裝箱。 – IllidanS4 2014-11-04 00:01:19