2
avril
2007
Surpris par le RealProxy
avril
2007
J’ai été surpris par le comportement du RealProxy :
Le code suivant :
internal class BusinessProxy<BusinessType> : RealProxy where BusinessType : BusinessObject, new()
{
private BusinessType _businessObject;
protected BusinessProxy(BusinessType businessObject)
: base(typeof(BusinessType))
{
_businessObject = businessObject;
}
public static BusinessType Create()
{
return CreateProxy(new BusinessType());
}
public static BusinessType CreateProxy(BusinessType businessObject)
{
return (BusinessType)(new BusinessProxy<BusinessType>(businessObject).GetTransparentProxy());
}
public override IMessage Invoke(IMessage msg)
{
return RemotingServices.ExecuteMessage(_businessObject, (IMethodCallMessage)msg);
}
}
public abstract class BusinessObject : MarshalByRefObject
{
}
class Class2 : BusinessObject
{
private string _s1;
private void SetS1(string s1)
{
_s1 = s1;
}
public static Class2 Create(string s1)
{
Class2 c2 = BusinessProxy<Class2>.Create();
c2._s1 = s1;
return c2;
}
}
{
private BusinessType _businessObject;
protected BusinessProxy(BusinessType businessObject)
: base(typeof(BusinessType))
{
_businessObject = businessObject;
}
public static BusinessType Create()
{
return CreateProxy(new BusinessType());
}
public static BusinessType CreateProxy(BusinessType businessObject)
{
return (BusinessType)(new BusinessProxy<BusinessType>(businessObject).GetTransparentProxy());
}
public override IMessage Invoke(IMessage msg)
{
return RemotingServices.ExecuteMessage(_businessObject, (IMethodCallMessage)msg);
}
}
public abstract class BusinessObject : MarshalByRefObject
{
}
class Class2 : BusinessObject
{
private string _s1;
private void SetS1(string s1)
{
_s1 = s1;
}
public static Class2 Create(string s1)
{
Class2 c2 = BusinessProxy<Class2>.Create();
c2._s1 = s1;
return c2;
}
}
génère une erreur à l’exécution lorsque je fais c2._s1 = s1;
. En revanche, si je fais c2.SetS1(s1);
à la place, tout va bien ! De même, si j’utilise une propriété, il n’y a aucun problème.
Ca me fait un peu pensé à un problème inverse avec les structures :
public struct Test
{
private int _toto;
public Test(int toto)
{
Toto = toto;
}
public int Toto
{
get { return _toto; }
set { _toto = value; }
}
}
{
private int _toto;
public Test(int toto)
{
Toto = toto;
}
public int Toto
{
get { return _toto; }
set { _toto = value; }
}
}
ce code ne compile pas mais celui là oui :
public struct Test
{
private int _toto;
public Test(int toto)
{
_toto = toto;
}
public int Toto
{
get { return _toto; }
set { _toto = value; }
}
}
{
private int _toto;
public Test(int toto)
{
_toto = toto;
}
public int Toto
{
get { return _toto; }
set { _toto = value; }
}
}