gpt4 book ai didi

c# - 调试和属性加载

转载 作者:太空宇宙 更新时间:2023-11-03 15:24:44 25 4
gpt4 key购买 nike

我有一个对象代表我数据库中一个表的记录,例如“项目”。

我的 User 类有不同的属性,这些属性是其他表的记录,例如,'Client' 或 'Accountancy'。这些也具有相关表的属性。

这些属性中的每一个都返回一个本地值(已经加载),如果不为空,并且没有加载信息,它会生成一个从数据库中获取该值的请求。

我的问题如下:当我设置断点并在调试窗口中检查对象时,它会自动加载属性的所有值,因此请求数据库。

在这种情况下,我目前无法获得对象的精确静态快照。

如果在调试窗口中,有没有办法在代码中不通过这部分代码?例如,类似的东西:

public MyBaseObject GetProperty<T>(string columnName_, string alias_ = null) where T : MyBaseObject, new()
{
var ret = GetExtract<T>(columnName_, alias_);

// if the data are loaded
if (ret.Id != null)
return ret;

// Fake boolean I would like
if(InDebugWindowAfterAbreakPointForInstance)
return ret;
else
ret = LoadFromDatabase<T>(columnName_, alias_)
return ret;
}

我在调试器中发现了不同的属性,例如 DebuggerStepperBoundaryAttribute,但没有任何东西可以做类似的事情。

最佳答案

在这种情况下,我所知道的唯一方法是使用 DebuggerTypeProxy对于您的每种类型,然后在该代理中让它直接访问支持字段,而不是通过导致数据库查找发生的属性。

这是一个简单的示例程序。

public class Program
{
public static void Main(string[] args)
{
var client = new Client();
Debugger.Break();
Debugger.Break();
}
}

[DebuggerTypeProxy(typeof(ClientDebugView))]
public class Client : MyBaseObject
{
private string _firstName;
private string _lastName;

public string FirstName
{
get
{
if (_firstName == null)
_firstName = GetProperty<string>("FirstName");

return _firstName;
}
set
{
if (Equals(_firstName, value))
return;
_firstName = value;
UpdateDatabase(_firstName, "FirstName");
}
}

public string LastName
{
get
{
if (_lastName == null)
_lastName = GetProperty<string>("LastName");

return _lastName;
}
set
{
if (Equals(_lastName, value))
return;
_lastName = value;
UpdateDatabase(_lastName, "LastName");
}
}

internal class ClientDebugView : MyBaseObjectDebugView
{
private readonly Client _client;

public ClientDebugView(Client client)
: base(client)
{
_client = client;
}

public string FirstName
{
get { return _client._firstName; }
}

public string LastName
{
get { return _client._lastName; }
}
}
}

[DebuggerTypeProxy(typeof(MyBaseObjectDebugView))]
public class MyBaseObject
{
private Guid? _id;

public Guid? Id
{
get
{
if (_id == null)
_id = GetProperty<Guid?>("Id");

return _id;
}
set
{
if (Equals(_id, value))
return;
_id = value;
UpdateDatabase(_id, "Id");
}
}

//Fake loading data from a database.
protected T GetProperty<T>(string columnName)
{
object ret = null;
switch (columnName)
{
case "Id":
ret = Guid.NewGuid();
break;
case "LastName":
ret = "Smith";
break;
case "FirstName":
ret = "John";
break;
default:
ret = null;
break;
}

return (T)ret;
}

protected void UpdateDatabase<T>(T id, string s)
{
throw new NotImplementedException();
}

internal class MyBaseObjectDebugView
{
private readonly MyBaseObject _baseObject;

public MyBaseObjectDebugView(MyBaseObject baseObject)
{
_baseObject = baseObject;
}

public Guid? Id
{
get { return _baseObject._id; }
}
}
}

如果您在调试器中查看 client 对象,您会看到它在两个断点之间留下了支持字段 null,除非您首先打开“原始 View ”断点。

enter image description here

关于c# - 调试和属性加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35842956/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com