C#: Получение значения через отражение

Существует по крайней мере один случай, когда я думаю, что Вам, вероятно, придется поймать throwable или универсальное исключение - при выполнении отдельного потока для выполнения задачи, можно хотеть знать, поймал ли метод "выполнения" потока некоторое исключение или нет. В этом случае Вы, вероятно, сделаете что-то вроде этого:


public void run() {
   try {
       ...
   }
   catch(Throwable t) {
       threadCompletionError = t;
   }
}

я действительно не уверен, является ли это лучший подход, но это работает. И у меня была ошибка "ClassNotFound", будучи повышенным JVM, и это - ошибка и не исключение. Если я позволяю исключению, брошены, я не уверен, как поймать его в вызывающем потоке (вероятно, существует метод, но я не знаю об этом - еще).

Что касается метода ThreadDeath, не называйте "Thread.stop ()" методом. Назовите Thread.interrupt и имейте Ваш поток, чтобы проверить, был ли он прерван кем-то.

5
задан 15 September 2009 в 15:21
поделиться

4 ответа

I usually don't try to plug products I'm involved in, but this is a perfect problem to be solved by Vici Parser (open source expression parser for .NET):

var parser = new CSharpParser();
var context = new CSharpContext();

context["car"] = carobject;

string brandNameOfCar = 
          parser.Evaluate<string>("car.brand.name.ToFormatedString()", context);
1
ответ дан 14 December 2019 в 19:19
поделиться

I didn't test this, but here's something that should work:

car c = new car();
object val = typeof(car).GetField("carbrand", BindingFlags.Private).GetValue(c);
string result = (val as brand).ToFormattedString();
4
ответ дан 14 December 2019 в 19:19
поделиться

Typeof(car).GetProperty("brand", bindingflags.instance | bindingflags.private).GetValue(carobject,null) should so it. Sry for minor syntax errors bit im on my phone

edit: the above Will give you the brand object and you Can the dó the same to get to the name property

0
ответ дан 14 December 2019 в 19:19
поделиться

Было бы разумнее иметь конструктор car, который принимает строку в качестве параметра и делает что-то вроде следующего:

class brand
{
    public string name;
}

class car
{

    public car(string s)
    {
        Match match = Regex.Match(s, @"(?<carname>[^\.]+)\.(?<brandname>.+)");
        if (match.Success)
        {
            this.carname = match.Groups["carname"].Value;
            this.carbrand = new brand();
            this.carbrand.name = match.Groups["brandname"].Value;
        } else
        {
            throw new ArgumentException("Not a valid car");
        }
    }

    string carname;
    brand carbrand;

    public override string ToString()
    {
        return carname + "." + carbrand.name;
    }
}

При следующем использовании:

car c = new car("M5.BMW");
Console.WriteLine(c.ToString());

Вы могли бы, конечно, разделите его на методы Parse и TryParse.

0
ответ дан 14 December 2019 в 19:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: