как получить общее имя свойства входного параметра в цикле foreach - PullRequest
0 голосов
/ 06 февраля 2019

как пройти через метод универсального параметра?

У меня есть коллекция с универсальным методом.

public void DoSomething<T>(List<T> input)
{
    // I want to foreach
    foreach (var v in input)
    {
        byte[] data = v.Data;
        string name = v.Name;
    }
}

Моя проблема: я не получаю Данные и Имя в V. его универсальный,Как этого добиться

Ответы [ 2 ]

0 голосов
/ 06 февраля 2019

То, что вы пытаетесь достичь, - это создать общий метод, который выполняет итерацию по какому-то определенному типу для выполнения чего-то особенного, и в этом случае это будет из-за общего общего поведения, поэтому нет никакой дополнительной ценности в создании универсальногометод, который перебирает определенные члены, чтобы сделать что-то, если между ними нет ничего общего, поэтому в вашем случае вы можете наложить универсальный тип на условие для реализации интерфейса:

public void DoSomething<T>(List<T> input) where T : ICommonLogic
{
    foreach(var v in input)
    {
        byte[] data = v.Data;
        string name = v.Name;
    }
}

Или даже чище, добавиврасширение:

public static class CommonLogicExtensions
{
   public static DoSomething(this IEnumerable<ICommonLogic> input)
   {
        foreach(var v in input)
        {
            byte[] data = v.Data;
            string name = v.Name;
        }
   }
}

Использование обобщений несколько иное, например, создание структуры данных, которая принимает объекты различного типа, такие как List, но когда дело доходит до определенного или специального поведения, общий интерфейс должениспользовать вместо.

0 голосов
/ 06 февраля 2019

Вы можете использовать все ваши общие входные данные для реализации интерфейса, который предоставляет нужные вам свойства.Затем вам нужно наложить ограничение на ваш общий T, чтобы использовать эти свойства:

void Main()
{
    var list = new List<RandomData>();

    DoSomething(list);
}

public void DoSomething<T>(List<T> input) where T : IData
{
    foreach(var v in input)
    {
        byte[] data = v.Data;
        string name = v.Name;
    }
}

public interface IData
{
    byte[] Data { get; set; }

    string Name { get; set; }
}

class RandomData : IData
{
    public byte[] Data { get; set; }

    public string Name { get; set; }
}
...