-2

我需要在 C# 中通过引用传递 this 对象。但如您所知,这是不可能的。我有一个多层应用程序。简而言之,DAL 从 Web 服务中获取 JSON 格式的数据。JSON 数据必须在业务层对象中进行转换。因此,我初始化了业务层对象并将其传递给 DAL。DAL 会将数据转换为对象。我展示了一个代码示例。首先是 DAL:

public Stream  GetSession ( ref BusinessLayer.Session session)
{
    Stream dataStream;
    // Use the ServiceManager to build send the data to the services
    // SOAServiceManager sm = new SOAServiceManager("http://www.Test.da/authentication.json","",DataAccessLayer.HTTPMethod.POST);

    // Add the Values 
    sm.AddCriteriaValue ("name","demo");
    sm.AddCriteriaValue ("password","demo");

    // Now it's show time and the datastream is full
    dataStream = sm.CommitPost ();

    DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(BusinessLayer.Session));

    session = (BusinessLayer.Session)ser.ReadObject(dataStream);

    return dataStream;
}

现在业务层正在使用这个 DAL 类:

namespace BusinessLayer
{
    public class Session
    {
        public bool Success { get; set; }
        public string Name { get; set; } 

        public Session ()
        {
            DataAccessLayer.Session dal_Session = new DataAccessLayer.Session ();
            dal_Session.GetSession ( ref this);
        }
    }
}

所以问题是,不可能发送“this”作为参考。所以我看到的解决方案是创建一个复制对象并将其发送到 DAL,然后将其值分配给 this 对象。但这不是一个聪明的解决方案。有没有办法在 C# 中解决这个问题?

4

4 回答 4

4

如果您更改应用程序的结构,则绝对不需要这样做。

让 DAL 返回 a Session,而不是分配 ref 对象:

public BusinessLayer.Session GetSession ()
{
    //...
    return (BusinessLayer.Session)ser.ReadObject(dataStream);
}

编辑不需要从构造函数调用该方法。显然,以下仍然不起作用:

public Session ()
{
    this = dal.GetSession();
}

但是,您可以只在调用此构造函数的客户端中进行调用。改变

Session session = new Session();

Session session = dal.GetSession();

或者,如果你想限制客户端和 dal 的耦合,你可以例如在你的Session

public class Session
{
    //...

    public static Session GetSession()
    {
        return dal.GetSession();
    }
}
于 2014-03-18T13:41:29.417 回答
2

您不应该创建新Session对象。而是替换DataContractJsonSerializerNewtonsoft.Json(因为前者不公开此类方法)并使用读取 JSON 数据并填充现有对象的方法:

using (var reader = new Newtonsoft.Json.JsonTextReader(new StreamReader(dataStream)))
{
    var serializer = new Newtonsoft.Json.JsonSerializer();
    serializer.Populate(reader, session);
}

或者不要使用构造函数,而是使用静态工厂方法:

public class Session
{
    private Session() { }
    public static Create()
    {
        DataAccessLayer.Session dal_Session = new DataAccessLayer.Session ();
        var session = new Session();
        dal_Session.GetSession (ref session);
        return session;
    }
}
于 2014-03-18T13:50:53.230 回答
1

您可以将其作为引用传递,因为该对象是引用类型。

于 2014-03-18T13:40:48.693 回答
0

C# 中的任何非基元始终通过引用传递。考虑这段代码:

public static void Main()
{
    RefType r1 = new RefType();
    RefType r2 = r1;

    r1.Sprop = "hi there";

    Console.WriteLine(r2.Sprop);
}

public class RefType
{
    public string Sprop { get; set; }
}

你认为输出应该是什么?我们从来没有将Sprop值设置r2为任何东西。但是r2设置为等于r1,并且在 VB.Net 和 C# 中,这意味着 r2 和 r1 具有相同的指针,指向RefType所创建的同一对象。

因此,输出是 "hi there"

因此,您不需要this使用ref关键字传递,因为任何可以引用的东西都this已经是引用类型。

于 2014-03-18T13:49:37.750 回答