использование c# обобщенных методов расширения для работы с классом, а не с коллекцией - PullRequest
1 голос
/ 30 марта 2020
I have the following types defined:
-----------------------------------

interface IMyInterface<T> where T : class
{
   void BlahBlah();
}
abstract class MyBase<T> : IMyInterface<T> where T : class
{
   public abstract T MyInfo { get; set; }
   public abstract T MyInfo2 { get; set; }
   public void BlahBlah()
   {
       Console.WriteLine(MyInfo + ", " + MyInfo2);
   }
}
class MyConcreteClass1<T> : MyBase<T> where T : class
{
   public override T MyInfo { get; set; }
   public override T MyInfo2 { get; set; }
}
class MyConcreteClass2<T> : MyBase<T> where T : class
{
   public override T MyInfo { get; set; }
   public override T MyInfo2 { get; set; }
}


public static class DataOperations<T, U> where T : class where U : class
{
        public static U Operate(this T source, U destination)
        {
            var sourceProps = source.GetType().GetProperties();
            var destinationProps = destination.GetType().GetProperties();

                .
                .
                .
            return destination;
        }
}

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

MyConcreteClass1<String> class1 = new MyConcreteClass1<String>();
class1.MyInfo = "Some Value";
class1.MyInfo2 = "another value";
MyConcreteClass2<String> class2 = new MyConcreteClass2<String>();
var c2 = class1.Operate(class2);

Проблема в том, что я получаю: "Расширение CS1106 метод должен быть определен в не универсальном c stati c классе "в имени класса DataOperations.

Ответы [ 3 ]

1 голос
/ 30 марта 2020

Тип объявления должен быть не универсальным c, но метод может быть универсальным c. Рассмотрим вместо этого:

public static class DataOperations
{
        public static U Operate<T, U>(this T source, U destination)
             where T : class where U : class
        { // ...
        }
}
0 голосов
/ 30 марта 2020

Методы расширения должны быть определены - как состояния ошибок - в non-generi c stati c (верхнего уровня) классе.

Так что вам нужно сделать DataOperations класс не-generi c, а сам метод generi c вместо:

public static class DataOperations
{
        public static U Operate<T, U>(this T source, U destination) where T : class where U : class

        {
            var sourceProps = source.GetType().GetProperties();
            var destinationProps = destination.GetType().GetProperties();

                .
                .
                .
            return destination;
        }
}
0 голосов
/ 30 марта 2020

Переместите определения c в метод:

public static class DataOperations
{
        public static U Operate<T, U>(this T source, U destination)  where T : class where U : class
        {
            // Whatever
        }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...