好的。假设你知道反射并创建一个新的AppDomain
。我知道你知道该怎么做...... :)
我已经创建了两个帮助类,允许你传递匿名对象。 ProxyAnonymousObject
和ProxyDynamicObject
。您在第一个AppDomain
中创建ProxyAnonymousObject
,并在其他AppDomain
中使用ProxyDynamicObject
。 (这两个对象在主AppDomain
库中存在)
[Serializable]
public class ProxyAnonymousObject : ISerializable {
static Dictionary<string, Type> cached = new Dictionary<string, Type>();
object model;
public Dictionary<string, object> ModelProperties = new Dictionary<string, object>();
public ProxyAnonymousObject(object model) { this.model = model; }
public ProxyAnonymousObject(SerializationInfo info, StreamingContext ctx) {
try {
string fieldName = string.Empty;
object fieldValue = null;
foreach (var field in info) {
fieldName = field.Name;
fieldValue = field.Value;
if (string.IsNullOrWhiteSpace(fieldName))
continue;
if (fieldValue == null)
continue;
ModelProperties.Add(fieldName, fieldValue);
}
} catch (Exception e) {
var x = e;
}
}
public void GetObjectData(SerializationInfo info, StreamingContext context) {
foreach (var pi in model.GetType().GetProperties()) {
info.AddValue(pi.Name, pi.GetValue(model, null), pi.PropertyType);
}
}
}
public class ProxyDynamicObject : DynamicObject{
internal ProxyAnonymousObject Proxy { get; set; }
public ProxyDynamicObject(ProxyAnonymousObject model) {
this.Proxy = model;
}
public override bool TryGetMember(GetMemberBinder binder, out object result) {
result = Proxy.ModelProperties[binder.Name];
return true;
}
}
为了得到这个在你MarshalByRefObject
继承类工作,你刚才设置的目标dynamic object
等于new ProxyDynamicObject(model)
。在我写下的例子中,我打了一个这样的电话。
instance = Activator.CreateInstance(type);
var setModel = type.GetMethod("SetModel", BindingFlags.Public | BindingFlags.Instance);
var render = type.GetMethod("Render", BindingFlags.Public | BindingFlags.Instance);
setModel.Invoke(instance, new object[] { new ProxyDynamicObject(model) });
render.Invoke(instance, null);
我写了一个博客帖子大约是http://buildstarted.com/2011/06/28/getting-anonymous-types-to-cross-the-appdomain-boundary/来解释它更详细一点。 (尽管这是我不擅长的)
这个实现肯定有问题。它不支持嵌套的匿名类型,我相当肯定它会打破一般。但这绝对是让你走上正轨的一些东西。
我有一个答案,但它比这里可以发布更复杂...我会试着压缩它,但是当我找出如何解释它的时候,源代码将会发布到我的博客上。有一些小事情是有点... won ... ...会尝试先解决这些问题。 – Buildstarted