Метод расширения для исключения, требующий динамического универсального типа - PullRequest
0 голосов
/ 03 декабря 2010

Этот вопрос задавался по-разному ранее, но ответы мне не помогают, потому что (1) я не контролирую встроенные классы Exception и (2) Activator.CreateInstance() возвращает объект / экземпляр, где мне нужен истинный динамический тип.

Я пытаюсь создать метод расширения, который позволяет мне выбрасывать FaultException из моей службы WCF, основываясь на исключении, которое я ловлю. Например:

try {
    ...
}
catch (ArgumentNullException exc) {
    throw new FaultException<ArgumentNullException>(exc);
}

прямолинеен. Но если я хочу расширить это в общем виде, я бы использовал класс расширения, например:

try {
    ...
}
catch (Exception exc) {
    exc.ThrowFaultException();
}

Я, конечно, зациклен на реализации метода расширения:

public static void ThrowFaultException(this Exception exc) {

    //  Gives me the correct type...
    Type exceptionType = exc.GetType();

    //  But how the heck do I use it?
    throw new FaultException<???>(exc);
}

Ответы здесь и здесь не помогают. Есть идеи?

Ответы [ 3 ]

3 голосов
/ 03 декабря 2010

Попробуйте это:

public static void ThrowFaultException<TException>(this TException ex) where TException : System.Exception
{
    throw new FaultException<TException>(ex);
}
1 голос
/ 03 декабря 2010
   public static void ThrowFaultException(this Exception exc)
    {
        //  Gives me the correct type...
        Type exceptionType = exc.GetType();
        var  genericType = typeof(FaultException<>).MakeGenericType(exceptionType);
        //  But how the heck do I use it?
        throw (Exception)Activator.CreateInstance(genericType, exc);
    }
1 голос
/ 03 декабря 2010

Вам не нужно приводить объект, возвращенный Activator.CreateInstance, в FaultException <?>, Чтобы выбросить его. Приведения его к Исключению достаточно:

var type = typeof(FaultException<>).MakeGenericType(exc.GetType());

throw (Exception)Activator.CreateInstance(type, exc);

Я бы не бросил исключение в ThrowFaultException, хотя:

try
{
    ...
}
catch (Exception e)
{
    throw e.WrapInFaultException();
}

public static Exception WrapInFaultException(this Exception e)
{
    var type = typeof(FaultException<>).MakeGenericType(e.GetType());

    return (Exception)Activator.CreateInstance(type, e);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...