95 lines
1.5 KiB
C#
95 lines
1.5 KiB
C#
using System;
|
|
|
|
|
|
public abstract class ViProvider<T>
|
|
where T : struct
|
|
{
|
|
public abstract T Value { get; }
|
|
}
|
|
|
|
public class ViSimpleProvider<T> : ViProvider<T>
|
|
where T : struct
|
|
{
|
|
public ViSimpleProvider() { }
|
|
public ViSimpleProvider(T value) { _value = value; }
|
|
public override T Value { get { return _value; } }
|
|
public void SetValue(T value) { _value = value; }
|
|
T _value;
|
|
}
|
|
|
|
public class ViPtrProvider<T>
|
|
where T : class
|
|
{
|
|
public static implicit operator T(ViPtrProvider<T> ptr)
|
|
{
|
|
if (System.Object.ReferenceEquals(ptr, null))
|
|
{
|
|
return null;
|
|
}
|
|
else
|
|
{
|
|
return ptr._obj;
|
|
}
|
|
}
|
|
|
|
public ViPtrProvider()
|
|
{
|
|
|
|
}
|
|
public ViPtrProvider(T obj)
|
|
{
|
|
Set(obj);
|
|
}
|
|
public ViPtrProvider(ViPtrProvider<T> ptr)
|
|
{
|
|
Set(ptr._obj);
|
|
}
|
|
public void Clear()
|
|
{
|
|
_obj = null;
|
|
}
|
|
public void Set(T obj)
|
|
{
|
|
_obj = obj;
|
|
}
|
|
|
|
T _obj;
|
|
}
|
|
|
|
public class Demo_Provider
|
|
{
|
|
public class ViPtrProviderClass
|
|
{
|
|
ViPtrProvider<ViPtrProviderClass> _ptrProvider = new ViPtrProvider<ViPtrProviderClass>();
|
|
public static implicit operator ViPtrProvider<ViPtrProviderClass>(ViPtrProviderClass obj)
|
|
{
|
|
if (!System.Object.ReferenceEquals(obj, null))
|
|
{
|
|
return obj._ptrProvider;
|
|
}
|
|
else
|
|
{
|
|
return null;
|
|
}
|
|
}
|
|
|
|
public ViPtrProviderClass()
|
|
{
|
|
_ptrProvider.Set(this);
|
|
}
|
|
|
|
public void Clear()
|
|
{
|
|
_ptrProvider.Clear();
|
|
}
|
|
}
|
|
|
|
public static void Test()
|
|
{
|
|
ViPtrProviderClass obj = new ViPtrProviderClass();
|
|
ViPtrProvider<ViPtrProviderClass> ptr = obj;
|
|
ViPtrProviderClass obj2 = ptr;
|
|
obj.Clear();
|
|
ViPtrProviderClass obj4 = ptr;
|
|
}
|
|
} |