#endif
public class ObservableCollection<T> : Collection<T>, INotifyCollectionChanged, INotifyPropertyChanged {
[Serializable]
- sealed class Reentrant : IDisposable {
- private int count = 0;
+#if !MOBILE
+ [TypeForwardedFrom (Consts.WindowsBase_3_0)]
+#endif
+ sealed class SimpleMonitor : IDisposable {
+ private int _busyCount = 0;
- public Reentrant()
+ public SimpleMonitor()
{
}
public void Enter()
{
- count++;
+ _busyCount++;
}
public void Dispose()
{
- count--;
+ _busyCount--;
}
public bool Busy
{
- get { return count > 0; }
+ get { return _busyCount > 0; }
}
}
- private Reentrant reentrant = new Reentrant ();
+ private SimpleMonitor _monitor = new SimpleMonitor ();
public ObservableCollection ()
{
{
}
+ [field:NonSerializedAttribute()]
public virtual event NotifyCollectionChangedEventHandler CollectionChanged;
+ [field:NonSerializedAttribute()]
protected virtual event PropertyChangedEventHandler PropertyChanged;
event PropertyChangedEventHandler INotifyPropertyChanged.PropertyChanged {
protected IDisposable BlockReentrancy ()
{
- reentrant.Enter ();
- return reentrant;
+ _monitor.Enter ();
+ return _monitor;
}
protected void CheckReentrancy ()
NotifyCollectionChangedEventHandler eh = CollectionChanged;
// Only have a problem if we have more than one event listener.
- if (reentrant.Busy && eh != null && eh.GetInvocationList ().Length > 1)
+ if (_monitor.Busy && eh != null && eh.GetInvocationList ().Length > 1)
throw new InvalidOperationException ("Cannot modify the collection while reentrancy is blocked.");
}
public class ObservableCollection<T> : Collection<T>, INotifyCollectionChanged, INotifyPropertyChanged {
private class Reentrant : IDisposable {
- private int count = 0;
+ private int _busyCount = 0;
public Reentrant()
{
public void Enter()
{
- count++;
+ _busyCount++;
}
public void Dispose()
{
- count--;
+ _busyCount--;
}
public bool Busy
{
- get { return count > 0; }
+ get { return _busyCount > 0; }
}
}
// EMIT ow.WriteAssembly (writer, memberType.Assembly);
gen.Emit (OpCodes.Ldarg_1);
gen.Emit (OpCodes.Ldarg_2);
+#if NET_4_0
+ EmitLoadType (gen, memberType);
+ gen.EmitCall (OpCodes.Callvirt, typeof(ObjectWriter).GetMethod("WriteTypeAssembly"), null);
+#else
EmitLoadTypeAssembly (gen, memberType, field.Name);
gen.EmitCall (OpCodes.Callvirt, typeof(ObjectWriter).GetMethod("WriteAssembly"), null);
+#endif
gen.Emit (OpCodes.Pop);
}
}
// EMIT writer.Write ((int)ow.GetAssemblyId (type.Assembly));
gen.Emit (OpCodes.Ldarg_2);
gen.Emit (OpCodes.Ldarg_1);
+#if NET_4_0
+ EmitLoadType (gen, type);
+ gen.EmitCall (OpCodes.Callvirt, typeof(GetForwardedAttribute).GetMethod("GetAssemblyName"), null);
+ gen.EmitCall (OpCodes.Callvirt, typeof(ObjectWriter).GetMethod("GetAssemblyNameId"), null);
+#else
EmitLoadTypeAssembly (gen, type, member);
gen.EmitCall (OpCodes.Callvirt, typeof(ObjectWriter).GetMethod("GetAssemblyId"), null);
+#endif
gen.Emit (OpCodes.Conv_I4);
EmitWrite (gen, typeof(int));
break;
gen.EmitCall (OpCodes.Callvirt, typeof(Type).GetProperty("Assembly").GetGetMethod(), null);
}
+ static void EmitLoadType (ILGenerator gen, Type type)
+ {
+ gen.Emit (OpCodes.Ldtoken, type);
+ gen.EmitCall (OpCodes.Call, typeof(Type).GetMethod("GetTypeFromHandle"), null);
+ }
+
static void EmitWrite (ILGenerator gen, Type type)
{
gen.EmitCall (OpCodes.Callvirt, typeof(BinaryWriter).GetMethod("Write", new Type[] { type }), null);
using System.Runtime.Remoting.Messaging;
using System.Reflection;
using System.Globalization;
+using System.Runtime.CompilerServices;
namespace System.Runtime.Serialization.Formatters.Binary
{
+#if NET_4_0
+ public class GetForwardedAttribute
+ {
+ public static string GetAssemblyName (Type self)
+ {
+ var attrs = self.GetCustomAttributes(
+ typeof (TypeForwardedFromAttribute), false);
+ if (attrs.Length == 0)
+ return self.Assembly.FullName;
+ else
+ return ((TypeForwardedFromAttribute)attrs [0]).AssemblyFullName;
+ }
+ }
+#endif
+
abstract class TypeMetadata
{
public string TypeAssemblyName;
{
InstanceType = instanceType;
InstanceTypeName = instanceType.FullName;
+#if NET_4_0
+ TypeAssemblyName = GetForwardedAttribute.GetAssemblyName(instanceType);
+#else
TypeAssemblyName = instanceType.Assembly.FullName;
+#endif
}
public override bool RequiresTypes {
}
TypeAssemblyName = info.AssemblyName;
+#if NET_4_0
+ InstanceTypeName = GetForwardedAttribute.GetAssemblyName(itype);
+#else
InstanceTypeName = info.FullTypeName;
+#endif
}
public override bool IsCompatible (TypeMetadata other)
while (type.IsArray)
type = type.GetElementType();
- ow.WriteAssembly (writer, type.Assembly);
+ ow.WriteTypeAssembly (writer, type);
}
}
writer.Write (name);
// Types of fields
- foreach (Type type in types)
+ foreach (Type type in types)
ObjectWriter.WriteTypeCode (writer, type);
// Type specs of fields
while (type.IsArray)
type = type.GetElementType();
- ow.WriteAssembly (writer, type.Assembly);
+ ow.WriteTypeAssembly (writer, type);
}
}
var tag = GetTypeTag (elementType);
if ((tag != TypeTag.ArrayOfObject) && (tag != TypeTag.ArrayOfString) && (tag != TypeTag.ArrayOfPrimitiveType))
- WriteAssembly (writer, elementType.Assembly);
+ WriteTypeAssembly (writer, elementType);
// Writes the array
writer.Write (str);
}
+ public int WriteTypeAssembly (BinaryWriter writer, Type aType)
+ {
+#if NET_4_0
+ return WriteAssemblyName (writer, GetForwardedAttribute.GetAssemblyName(aType));
+#else
+ return WriteAssemblyName (writer, aType.Assembly.FullName);
+#endif
+ }
+
public int WriteAssembly (BinaryWriter writer, Assembly assembly)
{
return WriteAssemblyName (writer, assembly.FullName);
case TypeTag.GenericType:
writer.Write (type.FullName);
+#if NET_4_0
+ string asmName = GetForwardedAttribute.GetAssemblyName(type);
+ writer.Write ((int) GetAssemblyNameId (asmName));
+#else
writer.Write ((int)GetAssemblyId (type.Assembly));
+#endif
break;
case TypeTag.ArrayOfPrimitiveType: