понимание func <T, TResult> C # - PullRequest
       32

понимание func <T, TResult> C #

0 голосов
/ 18 апреля 2010

Я пытаюсь изменить код своего кода, чтобы использовать Func Я создал образец, чтобы попытаться понять, как он работает, но я получаю ошибку компиляции. Например, ниже, когда я пытаюсь получить доступ к атрибутам параметра или вернуть возвращаемое значение, на которое жалуется компилятор.

Уточнения, пожалуйста.

using System;

namespace chsarp
{
    class Program
    {
        static void Main(string[] args)
        {
            ParamInput input = new ParamInput();
            input.ReservationID = 10;
            Test testMethod = new Test();
            Func<ParamInput, ReservationResult> methodToInvoke = testMethod.GetStatus;
            ReservationResult result = TestFn(methodToInvoke, input);
        }

        static Result TestFn<Param, Result>(Func<Param, Result> methodToInvoke, Param parameter) where Result : new()
        {
            Result result = new Result();
            try
            {
                result = methodToInvoke(parameter);
            }
            catch (Exception exception)
            {
                result.status = string.Format("Error-{0} during reserving {1}",
                                                parameter.ReservationID,
                                                exception.Message);
            }
            return result;
        }
    }

    class Test
    {
        public ReservationResult GetStatus(ParamInput msg)
        {
            ReservationResult result = new ReservationResult();
            result.status = string.Format("The ReservationID-{0}", msg.ReservationID);
            return result;

        }
    }

    class ParamInput
    {
        public int ReservationID { get; set; }
    }

    class ReservationResult
    {
        public string status { get; set; }
    }

}

Ответы [ 2 ]

4 голосов
/ 18 апреля 2010

Аннотированные ошибки компиляции:

error CS1061: 'Result' does not contain a definition for 'status'
error CS1061: 'Param' does not contain a definition for 'ReservationID'

Код, использующий аргументы универсального типа, может быть скомпилирован, только если компилятору известен член универсального типа. Он не знает, что аргумент типа Result имеет член status. Конечно, нет, если вы вызываете TestFn<object, object>().

Вам нужно будет использовать ограничение, чтобы сделать эту работу. Вы уже делаете, но new () недостаточно силен. Что-то вроде «где Result: IResult», например, где IResult является типом интерфейса, который имеет свойство status. Или базовый класс. Теперь компилятор может быть на 100% уверен, что любой разрешенный конкретный экземпляр универсального метода будет выполняться без ошибок во время выполнения. Поскольку его можно скомпилировать только тогда, когда он вызывается с типом, обладающим свойством «status».

Все то же самое относится к аргументу типа Param. Полезность универсального метода здесь быстро исчезает, когда вы делаете это, это не правильное использование. Если вы не можете использовать IResult, как вы можете IEnumerable.

1 голос
/ 18 апреля 2010

компилировать ...

Вы должны описать то, к чему стремитесь, в вашем вопросе.

См. Ответ Ганса для деталей, которые могут помочь вам понять ошибку.

Ваша проблема в том, что вы говорите, что функция должна получить результат, который можно создать, но вы не говорите, что ей нужно иметь свойство с именем "status".

namespace chsarp
{
    class Program
    {
        static void Main(string[] args)
        {
            Func<int, string> m = Test.GetStatus;
            var t = TestFn(m, 10);
        }

        static string TestFn<TParam>(Func<TParam, string> m, TParam p)
        {
            try { return m(p); }
            catch (Exception exception)
            {
                return string.Format("Reserving \"{0}\" failure exception: {1}", p, exception);
            }
        }
    }

    static class Test
    {
        public static string GetStatus(int inp)
        {
            return string.Format("The ReservationID-{0}", inp);
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...