Создать функцию для просмотра свойств метода в C #? - PullRequest
3 голосов
/ 23 августа 2010

То, что я пытаюсь сделать, - это создать функцию, которая будет вызываться из каждого метода в файле .cs, чтобы затем получить все имена свойств и значения, которые передаются в метод, и создать их строку.

Это будет использоваться для журнала отладки, чтобы показать, какое значение было у каждого свойства при возникновении ошибки, в качестве альтернативы ручному созданию строки каждый раз, когда возникает ошибка.

Возможно ли это?Я посмотрел на рефлексию и думаю, что это то, что мне нужно, но я не уверен в том, чтобы передать текущий метод из самого себя в новую функцию, а затем внутри функции, извлекая свойства метода (я предполагаю, что именно здесьотражение вступает в игру.)

Ответы [ 3 ]

2 голосов
/ 23 августа 2010

Как насчет чего-то вроде:

void Main()
{
var test = new TestObject();
test.a = "123";
test.b = "456";
var testProperties = (from prop in test.GetType().GetProperties() 
                        select new KeyValuePair<string,string>(prop.Name,prop.GetValue(test,null).ToString()));
foreach (var property in testProperties)
{
    Console.WriteLine(string.Format("Name: {1}{0}Value: {2}",Environment.NewLine,property.Key,property.Value));
}

var testMethods = (from meth in test.GetType().GetMethods() select new { Name = meth.Name, Parameters = 
    (from param in meth.GetParameters() 
        select new {Name = param.Name, ParamType=param.GetType().Name})} );

foreach (var method in testMethods)
{
    Console.WriteLine(string.Format("Method: {0}",method.Name));
    foreach(var param in method.Parameters)
    {
        Console.WriteLine("Param: " + param.Name + " (" + param.ParamType + ")");
    }
}
}

class TestObject
{
public string a { get; set; }
public string b { get; set; }
public string testMethod(string param1,int param2){return string.Empty;}
}

edit - Извините, я, кажется, неправильно понял вопрос. Я понятия не имею, как сделать то, что вы просите, или даже если это возможно.

1 голос
/ 23 августа 2010

Более простой подход может заключаться в том, чтобы перехватить исключение, а затем регистрировать только значения свойств, которые вас интересуют. Попытка достичь того, что вы хотите сделать с помощью отражения, возможно, излишняя.

ABC abc = new ABC();
try {
    a.xyz = "Runtime value";
    //Exception thrown here ...
}
catch (Exception ex)
{    
    Log.LogDebugFormatted(
      "Exception caught. abc.xyz value: {0}. Exception: {1}", abc.xyz, ex);
    throw ex;
}
1 голос
/ 23 августа 2010

Проверьте эту ссылку на дамп объектов - это также объясняет, что вам нужно управлять уровнем вложенности / насколько глубоко вы хотите спуститься в стек объектов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...