Что такое определение функции, чтобы иметь возможность передать назначение в качестве параметра - PullRequest
0 голосов
/ 29 июня 2019

Я в процессе рефакторинга старого кода. Теперь одна из проблем, с которыми я сталкиваюсь, это

 AllFields.Add(SomeProperty = new IntField
            {
                ColumnName = "SomeProperty",
                DisplayName = "Some Property",
                IsEditable = false,
                IsRequired = true
            });

Теперь я хочу что-то вроде метода расширения, который принимает назначение SomeProperty = new IntField() как параметр

e..g

public static class Extensions  
{  
  public static void Add(this IList<IField> source, SomeParameter value)  
  {  
  }  
}  

чтобы я мог сделать

IList<IField> AllFields = new List<IField>();  
AllFields.Add(SomeProperty = new IntField(){});
AllFields.Add(SomeProperty2 = new DecimalField(){});

Я забыл добавить. SomeProperty и SomeProperty имеют тип int и десятичный

1 Ответ

0 голосов
/ 29 июня 2019

Вы можете использовать для этого дженерики. Было бы достаточно что-то вроде следующего:

public static class Extensions  
{  
    public static void Add<T>(this IList<T> source, SomeParameter value) 
        where T : IField, new()  
    {  
    }  
} 

По сути, вы определяете универсальный метод, у которого единственный универсальный параметр T должен иметь конструктор без параметров (where T : new()) и реализует интерфейс IField.

Сделав это, вы могли бы написать что-то вроде следующего:

IList<IField> AllFields = new List<IField>();  
AllFields.Add(new IntField(){});
AllFields.Add(new DecimalField(){});

У вас также может быть что-то вроде следующего:

IField SomeProperty;
IField SomeProperty2;

IList<IField> AllFields = new List<IField>();  
AllFields.Add(SomeProperty = new IntField(){});
AllFields.Add(SomeProperty2 = new DecimalField(){});

Однако я не вижу никакого использования этого из того, что вы описали, что вы хотите сделать.

...