C # Передача классов в качестве параметра - PullRequest
0 голосов
/ 16 ноября 2018

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

Этот пост не совсем совпадает смой вопрос, как я хочу использовать значения в существующих классах.

Я посмотрел на использование Reflection , но не будет работать, потому что пространство имен "не может быть найдено", когда яЯ пишу в файл, и предпочел бы не включать директиву using, поскольку это усложнит зависимости.Я также взглянул на класс Activator , но это создает новый экземпляр объекта, и мне пришлось бы перечитать значения параметров.Возможно, это лучший вариант.

Settings.cs

namespace Globalsettings
{

    public static class FileSettings
    {
        /* Filenames for each required file. */
        public static string dataFile = null;
        public static string geometryFile = null;
        public static string temporarySpeedRestrictionFile = null;
        public static string trainListFile = null;                  /* File only required if includeAListOfTrainsToExclude is TRUE. */                                                                    
        public static List<string> simulationFiles = new List<string>(new string[6]);
        public static string aggregatedDestination = null;

    }

    public static class Settings
    {

    /* Data boundaries */
    public static DateTime[] dateRange;                 /* Date range of data to include. */
    public static bool excludeListOfTrains;             /* Is a list of trains that are to be excluded available. */

    /* Corridor dependant / Analysis parameters */
    public static double startKm;                       /* Start km for interpoaltion data. */
    public static double endKm;                         /* End km for interpolation data. */
    public static double interval;                      /* Interpolation interval (metres). */
    public static bool IgnoreGaps;                      /* Will the interpolation ignore gaps in the data (ie. gaps wont be interpolated through) */
    public static double minimumJourneyDistance;        /* Minimum distance of a train journey to be considered valid. */
    public static bool trainsStoppingAtLoops;           /* Analyse the performance of the trains as they stop at the loops. */

    /* Processing parameters */
    public static double loopSpeedThreshold;            /* Cuttoff for the simulation speed, when comparing the train to the simualted train. */
    public static double loopBoundaryThreshold;         /* Distance either side of the loop to be considered within the loop boundary (km). */
    public static double TSRwindowBoundary;             /* Distance either side of the TSR location to be considered within the TSR boundary (km). */
    public static double timeThreshold;                 /* Minimum time between data points to be considered a seperate train. */
    public static double distanceThreshold;             /* Minimum distance between successive data points. */

    /* Simulation Parameters */
    public static double Category1LowerBound;           /* The lower bound cuttoff for the underpowered trains. */
    public static double Category1UpperBound;           /* The upper bound cuttoff for the underpowered trains. */
    public static double Category2LowerBound;           /* The lower bound cuttoff for the overpowered trains. */
    public static double Category2UpperBound;           /* The upper bound cuttoff for the overpowered trains. */

    public static analysisCategory analysisCategory;
    public static trainOperator Category1Operator = trainOperator.Unknown;
    public static trainOperator Category2Operator = trainOperator.Unknown;
    public static trainOperator Category3Operator = trainOperator.Unknown;
    public static trainCommodity Category1Commodity = trainCommodity.Unknown;
    public static trainCommodity Category2Commodity = trainCommodity.Unknown;
    public static trainCommodity Category3Commodity = trainCommodity.Unknown;
    public static trainType Category1TrainType = trainType.Unknown;
    public static trainType Category2TrainType = trainType.Unknown;
    public static trainType Category3TrainType = trainType.Unknown;


}

}

Есть ли способ передать классы в функцию, подобную этой?

writeSettings(Filesettings fileS, Settings s)
{
    for (int i = 0; i < fileS.Count(); i++)
    {
        Console.WriteLine(fileS[i].Name,": ",fileS[i].value);
    }

    for (int i = 0; i < s.Count(); i++)
    {
        Console.WriteLine(s[i].Name,": ",s[i].value);
    }
}

1 Ответ

0 голосов
/ 16 ноября 2018

Класс - это просто тип.Вы передаете тип, объявляя свой метод следующим образом

void writeSettings(Type[] types)
{

и вызывая его следующим образом:

writeSettings(new Type[] { typeof(Settings), typeof(FileSettings) });

Вы также можете использовать params для более удобного синтаксиса:

void writeSettings(params Type[] types)
{

writeSettings(typeof(Settings), typeof(FileSettings) ); //Don't need to build an array

В любом случае я написал небольшой код, который переводит свойства для вас в словарь:

public static Dictionary<FieldInfo,object> ReadStaticFields(params Type[] types)
{
    return types
        .SelectMany
        (
            t => t.GetFields(BindingFlags.Public | BindingFlags.Static)
        )
        .ToDictionary(f => f, f => f.GetValue(null) );
}

И вы можете использовать его следующим образом:

var settings = ReadStaticFields
(
    typeof(Globalsettings.Settings), 
    typeof(Globalsettings.FileSettings)
);

foreach (var s in settings)
{
    Console.WriteLine
    (
        "{0}.{1} = {2}({3})", 
        s.Key.DeclaringType, 
        s.Key.Name, 
        s.Value, 
        s.Key.FieldType.Name
    );
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...