Как создать общий конвертер для единиц измерения в C#?

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

Вот то, с чего я начал, вместе с комментариями к коду о некоторых моих планах. Я не планирую использовать его так, как показано ниже, я просто тестировал некоторые возможности C#, которые я не очень хорошо знаю, я также не уверен, как развивать это дальше. Есть ли у кого-нибудь предложения о том, как создать то, о чем я говорю в комментариях ниже? Спасибо

namespace TemperatureConverter
{
    class Program
    {
        static void Main(string[] args)
        {
            // Fahrenheit to Celsius :  [°C] = ([°F] − 32) × 5⁄9
            var CelsiusResult = Converter.Convert(11M,Converter.FahrenheitToCelsius);

            // Celsius to Fahrenheit : [°F] = [°C] × 9⁄5 + 32
            var FahrenheitResult = Converter.Convert(11M, Converter.CelsiusToFahrenheit);

            Console.WriteLine("Fahrenheit to Celsius : " + CelsiusResult);
            Console.WriteLine("Celsius to Fahrenheit : " + FahrenheitResult);
            Console.ReadLine();

            // If I wanted to add another unit of temperature i.e. Kelvin 
            // then I would need calculations for Kelvin to Celsius, Celsius to Kelvin, Kelvin to Fahrenheit, Fahrenheit to Kelvin
            // Celsius to Kelvin : [K] = [°C] + 273.15
            // Kelvin to Celsius : [°C] = [K] − 273.15
            // Fahrenheit to Kelvin : [K] = ([°F] + 459.67) × 5⁄9
            // Kelvin to Fahrenheit : [°F] = [K] × 9⁄5 − 459.67
            // The plan is to have the converters with a single purpose to convert to
            //one particular unit type e.g. Celsius and create separate unit converters 
            //that contain a list of calculations that take one specified unit type and then convert to their particular unit type, in this example its Celsius.
        }
    }

    // at the moment this is a static class but I am looking to turn this into an interface or abstract class
    // so that whatever implements this interface would be supplied with a list of generic deligate conversions
    // that it can invoke and you can extend by adding more when required.
    public static class Converter
    {
        public static Func<decimal, decimal> CelsiusToFahrenheit = x => (x * (9M / 5M)) + 32M;
        public static Func<decimal, decimal> FahrenheitToCelsius = x => (x - 32M) * (5M / 9M);

        public static decimal Convert(decimal valueToConvert, Func<decimal, decimal> conversion) {
            return conversion.Invoke(valueToConvert);
        }
    }
}

Обновление: Пытаюсь прояснить свой вопрос:

Используя только мой пример с температурой, как бы я создал класс, содержащий список лямбда-преобразований в Цельсий, которому вы передаете заданную температуру, и он пытается преобразовать ее в Цельсий (если расчет доступен)

Пример псевдокода:

enum Temperature
{
    Celcius,
    Fahrenheit,
    Kelvin
}

UnitConverter CelsiusConverter = new UnitConverter(Temperature.Celsius);
CelsiusConverter.AddCalc("FahrenheitToCelsius", lambda here);
CelsiusConverter.Convert(Temperature.Fahrenheit, 11);
7
задан Danny Tuppeny 18 October 2014 в 21:03
поделиться