如果我有一个对象,其中包括IEnumerable,我转储这个对象,我得到枚举值。
有没有办法让Linqpad列出其他属性:
以下示例: 我可以获得Dump以包含Hello和数字属性吗?
void Main()
{
var t = new test();
var d = new Dictionary<string,string> {{"Hello","World"},{"Good by","Sky"}};
t.Dump();
d.Dump();
}
// Define other methods and classes here
public class test : IEnumerable
{
public string Hello { get { return "World"; }}
public List<int> digits { get { return new List<int> {0,1,2,3,4,5,6,7,8,9}; }}
public IEnumerator GetEnumerator() { yield return "Hej"; }
}
答案 0 :(得分:6)
您可以按如下方式编写 DumpPayload 扩展方法:
void Main()
{
var t = new test();
t.DumpPayload();
}
public static class Extensions
{
public static void DumpPayload (this IEnumerable o)
{
if (o == null)
{
o.Dump();
return;
}
var d = new Dictionary<string,object>();
foreach (var member in o.GetType().GetProperties())
try
{
d[member.Name] = member.GetValue (o, null);
}
catch (Exception ex)
{
d[member.Name] = ex;
}
d["AsEnumerable"] = o;
d.Dump();
}
}
如果您将此扩展程序方法放入“我的扩展程序”中,它将可供所有查询使用。
另一种解决方案是在测试类中实现ICustomMemberProvider:
public class test : IEnumerable, ICustomMemberProvider
{
public string Hello { get { return "World"; }}
public List<int> digits { get { return new List<int> {0,1,2,3,4,5,6,7,8,9}; }}
public IEnumerator GetEnumerator() { yield return "Hej"; }
IEnumerable<string> ICustomMemberProvider.GetNames()
{
return "Hello Enumerator".Split();
}
IEnumerable<Type> ICustomMemberProvider.GetTypes ()
{
return new [] { typeof (string), typeof (IEnumerable) };
}
IEnumerable<object> ICustomMemberProvider.GetValues ()
{
return new object [] { Hello, this.OfType<Object>() };
}
}
请注意,如果测试类是在另一个程序集中定义的,则无需引用LINQPad即可实现ICustomMemberProvider。您只需将以下定义粘贴到项目中,LINQPad就会将其选中:
namespace LINQPad
{
public interface ICustomMemberProvider
{
IEnumerable<string> GetNames ();
IEnumerable<Type> GetTypes ();
IEnumerable<object> GetValues ();
}
}
答案 1 :(得分:1)
据我所知,您尝试转储的对象是否实现了IEnumerable
,那么LINQPad总是希望将其转储为IEnumerable列表。正确删除界面会在转储的信息中显示Hello
和digits
属性。
从this link开始,您可以编写自己的转储,通过枚举集合和所有属性然后将整个内容输出为XHTML字符串来完成LINQPad之类的操作。我没试过这个。
答案 2 :(得分:0)
使用序列化程序?
Json.NET将以json格式为您完成所有这些工作。
Newtonsoft.Json.JsonConvert.SerializeObject(t,Newtonsoft.Json.Formatting.Indented)
如果您不想要json,那么选择您想要的序列化程序,或者您只需要执行序列化程序将要执行的操作,使用反射来迭代对象上的属性。