C# 如何在异常日志中识别通用对象?

C# 如何在异常日志中识别通用对象?,c#,generics,logging,custom-exceptions,C#,Generics,Logging,Custom Exceptions,我有一个助手方法,它接受泛型类型的参数。这个方法可以抛出异常,我记录这些异常以便以后调试。有些对象具有ID,有些对象具有名称,等等,这在尝试调试时非常有用。如何以有用的方式记录此信息?如果它是泛型方法还是非泛型方法,则除非您的对象为null,否则可以使用myObject.GetType().ToString()记录该类型。 编辑: 如果要从对象中读取更多信息,则可以如下方式读取对象属性: Type type = myObj.GetType(); List<string> info =

我有一个助手方法,它接受泛型类型的参数。这个方法可以抛出异常,我记录这些异常以便以后调试。有些对象具有ID,有些对象具有名称,等等,这在尝试调试时非常有用。如何以有用的方式记录此信息?

如果它是泛型方法还是非泛型方法,则除非您的对象为null,否则可以使用
myObject.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));
Type Type=myObj.GetType();
列表信息=新列表();
info.Add(“引发错误的对象类型为:”+type.ToString()+Environment.NewLine);
foreach(type.GetProperties()中的var prop)
{
如果(道具可阅读)
{
信息添加(“名称:+prop.Name+”,值:+prop.GetValue(myObj)+Environment.NewLine);
}
}
Logger.log(string.Join(“,info));

对于原语,这应该可以正常工作。对于对象,这取决于ToString方法的实现方式。还请注意,它不会递归读取,只读取类的直接成员。

如果它是泛型方法还是非泛型方法,则除非对象为null,否则可以使用
myObject.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));
Type Type=myObj.GetType();
列表信息=新列表();
info.Add(“引发错误的对象类型为:”+type.ToString()+Environment.NewLine);
foreach(type.GetProperties()中的var prop)
{
如果(道具可阅读)
{
信息添加(“名称:+prop.Name+”,值:+prop.GetValue(myObj)+Environment.NewLine);
}
}
Logger.log(string.Join(“,info));

对于原语,这应该可以正常工作。对于对象,这取决于ToString方法的实现方式。还请注意,它不会递归读取,只读取类的直接成员。

如果它是泛型方法还是非泛型方法,则除非对象为null,否则可以使用
myObject.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));
Type Type=myObj.GetType();
列表信息=新列表();
info.Add(“引发错误的对象类型为:”+type.ToString()+Environment.NewLine);
foreach(type.GetProperties()中的var prop)
{
如果(道具可阅读)
{
信息添加(“名称:+prop.Name+”,值:+prop.GetValue(myObj)+Environment.NewLine);
}
}
Logger.log(string.Join(“,info));

对于原语,这应该可以正常工作。对于对象,这取决于ToString方法的实现方式。还请注意,它不会递归读取,只读取类的直接成员。

如果它是泛型方法还是非泛型方法,则除非对象为null,否则可以使用
myObject.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));
Type Type=myObj.GetType();
列表信息=新列表();
info.Add(“引发错误的对象类型为:”+type.ToString()+Environment.NewLine);
foreach(type.GetProperties()中的var prop)
{
如果(道具可阅读)
{
信息添加(“名称:+prop.Name+”,值:+prop.GetValue(myObj)+Environment.NewLine);
}
}
Logger.log(string.Join(“,info));
对于原语,这应该可以正常工作。对于对象,这取决于ToString方法的实现方式。还请注意,它不会递归读取,只读取类的直接成员。

此函数从类型返回一个C风格的类型名(类似于
List
List

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;
}
公共静态字符串FancyTypeName(类型)
{
var typeName=type.Name.Split('`')[0];
if(type.IsGenericType)
{
typeName+=string.Format(“,string.Join(“,”,
type.GetGenericArguments().Select(v=>FancyTypeName(v)).ToArray()
);
}
返回typeName;
}
此函数从一个类型返回一个C风格的类型名(类似于
List
List

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;
}
公共静态字符串FancyTypeName(类型)
{
var typeName=type.Name.Split('`')[0];
if(type.IsGenericType)
{
typeName+=string.Format(“,string.Join(“,”,
type.GetGenericArguments().Select(v=>FancyTypeName(v)).ToArray()
);
}
返回typeName;
}
此函数从一个类型返回一个C风格的类型名(类似于
List
List

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;
}
公共静态字符串FancyTypeName(类型)
{
var typeName=type.Name.Split('`')[0];
if(type.IsGenericType)
{
typeName+=string.Format(“,string.Join(“,”,
type.GetGenericArguments().Select(v=>FancyTypeName(v)).ToArray()
);
}
返回typeName;
}
此函数从一个类型返回一个C风格的类型名(类似于
List
List

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;
}
公共静态字符串FancyTypeName(类型)
{
var typeName=type.Name.Split('`')[0];
if(type.IsGenericType)
{
typeName+=string.Format(“,string.Join(“,”,
type.GetGenericArguments().Select(v=>FancyTypeName(v)).ToArray()
);
}
返回typeName;
}

您可以将输入对象与异常一起记录您可以将输入对象与异常一起记录您可以将输入对象与异常一起记录您可以将输入对象与异常一起记录类型是很好的信息,但我希望有更具体的信息。类型是很好的信息,但是我希望能有更具体的东西。类型是好的信息