如何识别异常日志中的通用对象?

时间:2015-06-16 16:28:54

标签: c# generics logging custom-exceptions

我有一个辅助方法,它接受泛型类型的参数。此方法可以抛出异常,我将其记录以便稍后进行调试。有些对象有id,有些有名称等,在尝试调试时很有用。如何以有用的方式记录此信息?

2 个答案:

答案 0 :(得分:3)

如果它是通用方法,请注意,除非您的对象为null,否则可以使用myObject.GetType().ToString()

记录类型
Loger.log("Object type that has thrown an error is" + myObj.GetType().ToString());

修改

如果您想从对象中读取更多信息,那么您可以读取如下对象属性:

Type type = myObj.GetType();
List<string> info = new List<String>();
info.Add("Object type that has thrown an error is: " + type.ToString() + Environment.NewLine);
foreach (var prop in type.GetProperties())
{
    if (prop.CanRead)
    {
        info.Add("Name: " + prop.Name + " , Value: " + prop.GetValue(myObj) + Environment.NewLine);
    }
}
Logger.log(string.Join("", info));

这应该对原语没有任何问题。对于Objects,它取决于ToString方法的实现方式。另请注意,它不会递归读取,只是该类的直接成员。

答案 1 :(得分:0)

此函数从类型中返回C#样式类型名称(类似List<String>List<Dictionary<Int32,String>>)。

public static string FancyTypeName(Type type)
{
    var typeName = type.Name.Split('`')[0];
    if (type.IsGenericType)
    {
        typeName += string.Format("<{0}>", string.Join(",",
             type.GetGenericArguments().Select(v => FancyTypeName(v)).ToArray())
           );
    }
    return typeName;
}