Универсальные и определенные типы в одном классе

Действительно ли возможно иметь универсальные типы и неуниверсальные типы в одном классе??

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

Это - то, что я пытаюсь сделать

int commandCode;
 arg1;
 arg2;
 arg3;

Я должен прочитать 4 линии последовательности из текстового файла и попытаться разобрать те линии в

  1. интервал
  2. плавание
  3. , булев
  4. оставляет его как последовательность

(Сначала пытающийся разобрать это к 1, если не возможный к 2, если не возможный к 3, если не возможный к 4.)

И после знания, какой тип - каждый аргумент, определите каждую переменную с ее соответствующим типом

Например, с текстовым файлом с

  • commandCode=2
  • arg1=true
  • arg2=256
  • arg3=dont

У меня был бы объект с

  • int commandCode
  • < bool > arg1
  • < int > arg2
  • < string> arg3

И это произошло бы для любой комбинации, возможной для arg1 к arg3.

1
nl ja de
Потребитель метода должны к знать , что типы, или анонимный класс был бы достаточен? вы даже должны к знать , что типы, или они должны просто быть напечатаны по некоторой другой причине? Похоже на there' s часть загадки you' ре, не разделяющее и так it' s невозможный для нас, чтобы получить четкую картину того, какой ваш цель действительно. Несомненно, у вас есть эта небольшая потребность здесь, но потребность вытащена контекста для всех читателей.
добавлено автор Mike Perrenoud, источник
На самом деле я don' t должен знать тип переменных, я don' t хотят сделать что-либо с ними, но я должен работать с другим классом, у которого есть метод с тоннами перегрузок, я только знаю, что он получает 1 интервал, и между от 0 до 3 параметров (интервал, плавание, bool или последовательность). И я должен прочитать текстовый файл с большим количеством команд (всех их посылают с тем же самым методом), определите необходимые переменные, и послал правильные типы и ценности для параметров. (Для определения класса я знаю, что метод не скажет мне, если я буду неправ, это просто won' t делают что-либо, поэтому я должен послать его хорошо).
добавлено автор alejandromxl, источник

2 ответы

Если я understnad вы правильно можно только определить фактический тип во времени выполнения. В этом csae непатентованные средства не помогут вам очень, так как любой аргумент типа должен быть решен во время компиляции для этого, необходимо использовать отражение некоторым способом. Ниже фабрика, которая могла быть расширена, чтобы поддержать ваши потребности. Вы могли бы или, возможно, не нуждались бы в 16 различных методах в зависимости от того, сколько подклассов вы имеете в действительности (вам было бы нужно один для каждого подкласса с ниже подхода), вы могли также пропустить Создать метод и выбрать соответствующий класс/конструктора непосредственно

public class Command {

   public static Command Create(string[] textLines) {
     var args = textLines.Select(l => parseLine(l));
     var argTypes = args.Select(a => a.GetType().ToArray();
     return (Command)typeof(Command).GetMethod("Create",argTypes).Invoke(null,args);
   }

   public static Command Create(int commandType,
                                bool IsSponk,
                                int count, 
                                string description){
       return new CommandType1(commandType,
                               IsSponk,
                               count,
                               description);
   }
   private class CommandType1 : Command {
       public CommandType1(int commandType, bool IsSponk, int count, string description){
            ....
       }
   }
}
1
добавлено
Вы правы, конечно...
добавлено автор Spontifixus, источник

If you have variable types depending on the data you read (like in your case) it doesn't make much sense to use generics. Even if you take @Spontifixus approach you are not able to put all the created elements in one List, cause due to the different types used in each object you need for each combination your own List. Also if you later in code like to work with all the arguments, you need to query for each generic type to know how to read the desired value out of the current instance.

Если вы все еще думаете, что вам нужны универсальные типы (в этом случае), можно помочь себе при помощи универсального класса метод создателя и нормальный интерфейс:

public interface ICommand
{
    int CommandCode { get; set; }
    object Argument1 { get; }
    object Argument2 { get; }
    object Argument3 { get; }
}

public static class Command
{
    public static Command Create(int code, T1 arg1, T2 arg2, T3 arg3)
    {
        return new Command(code, arg1, arg2, arg3);
    }
}

public class Command : ICommand
{
    public Command(int code, T1 arg1, T2 arg2, T3 arg3)
    {
        CommandCode = code;
        Argument1 = arg1;
        Argument2 = arg2;
        Argument3 = arg3;
    }

    public int CommandCode { get; set; }
    public T1 Argument1 { get; set; }
    public T2 Argument2 { get; set; }
    public T3 Argument3 { get; set; }

    object ICommand.Argument1
    {
        get { return Argument1; }
    }

    object ICommand.Argument2
    {
        get { return Argument2; }
    }

    object ICommand.Argument3
    {
        get { return Argument3; }
    }
}

При помощи этого подхода можно создать случай через вывод типа, назвав метод создателя и поместить всех их в один список:

var commands = new List();
var myCommand = Command.Create(3, 4f, true, "hello world");
var commands.Add(myCommand);

Теперь вы получили свои родовые объекты в одном списке, но как вы работаете с этим списком? Наконец вы идете все время, используя интерфейс ICommand и придерживаетесь объекта , делая непатентованные средства бесполезными. Но возможно вы не думаете так, и этот подход мог бы помочь.

0
добавлено
проблема состоит в том, что во времени выполнения тип аргументов - not' t известный. Таким образом, требование создать, любой , Создают (объект, объект, объект, объект) или Создают (последовательность, последовательность, последовательность, последовательность)
добавлено автор Rune FS, источник
@RuneFS: Да, you' ре (возможно), право, но это зависит от того, как вы разбираете элементы заранее, который абсолютно открыт в этом вопросе. Также, поскольку я уже упомянул you' ll попадают в беду в более позднем доступе пункты через непатентованное средство, выбирая правильный тип (вызовите, это - решение времени компиляции, которое можно явно только принять во времени выполнения).
добавлено автор Oliver, источник
Microsoft Stack Jobs
Microsoft Stack Jobs
1 788 участник(ов)

Work & freelance only Microsoft Stack. Feed https://t.me/Microsoftstackjobsfeed Чат про F#: @Fsharp_chat Чат про C#: @CSharpChat Чат про Xamarin: @xamarin_russia Чат общения:@dotnettalks

Microsoft Developer Community Chat
Microsoft Developer Community Chat
584 участник(ов)

Чат для разработчиков и системных администраторов Microsoft Developer Community. __________ Новостной канал: @msdevru __________ Баним за: оскорбления, мат, рекламу, флуд, флейм, спам, NSFW контент, а также большое количество оффтоп тем. @banofbot