Member 13541148 Ответов: 2

Как сделать общий код в C sharp


Я новичок в программировании на C#. У меня есть 3 метода одинакового содержания, но разных типов. Я хочу сделать один общий метод для всех них. Но я не знаю, как это сделать. Пожалуйста, помогите мне. Большое спасибо...

public class insDatalog
    {
        public ObjectId _id { get; set; }
        public string _date { get; set; }
        public string _lCode { get; set; }
        public string _lName { get; set; }
        public string _stage { get; set; }
        public string _pcName { get; set; }
        public string _serial { get; set; }
        public string _model { get; set; }
        public string _uCode { get; set; }
        public string _uName { get; set; }
        public string _result { get; set; }
    }


public class insUnitLib
    {
        public ObjectId _id { get; set; }
        public string _uCode { get; set; }
        public string _uName { get; set; }
        public string _date { get; set; }
    }


public class insSerialNo
    {
        public ObjectId _id { get; set; }
        public string _serial { get; set; }
    }

public static void DeleteCollectionDataRow<T>(IMongoCollection<T> collection, insUnitLib t) where T: insUnitLib
        {
            collection.DeleteOne(b => b._id == t._id);
        }

public static void DeleteCollectionDataRow<T>(IMongoCollection<T> collection, insDatalog t) where T : insDatalog
        {
            collection.DeleteOne(b => b._id == t._id);
        }

public static void DeleteCollectionDataRow<T>(IMongoCollection<T> collection, insSerialNo t) where T : insSerialNo
        {
            collection.DeleteOne(b => b._id == t._id);
        }


Что я уже пробовал:

Я пытался искать в интернете, но до сих пор не получил никаких результатов.

2 Ответов

Рейтинг:
1

Dave Kreskowiak

Если все ваши классы T производны от одного и того же базового класса или интерфейса, вы можете использовать его вместо отдельных классов в where T пункт (лучшее решение!)

Или же вы можете просто использовать один метод и связать все классы вместе (не очень эффективно!):

public static void Delete....<T>(IMongoCollection<T> collection, insUnitLib t) where T: insUnitLib, insDatalog, insSerialNo


phil.o

Я не думаю, что это может сработать таким образом, так как тип T должен был бы наследовать три класса одновременно, что на данный момент все еще невозможно в C#.
Возможно, я ошибаюсь, так как не пробовал этого уже более двух лет, но ограничения на общий тип следует понимать с помощью компаратора AND, а не OR one.
:)

Dave Kreskowiak

Вот почему я сказал, что 3 класса должны наследовать от базового класса или интерфейса.

Рейтинг:
0

phil.o

Вы можете попытаться создать интерфейс и заставить ваши три класса реализовать этот интерфейс; затем вы можете поместить ограничение в объявление вашего универсального метода на сам интерфейс. Таким образом:

public interface IObjectWithId
{
   ObjectId _id { get; set; }
}

public class insDatalog : IObjectWithId
{
   // ...
}

public class insUnitLib : IObjectWithId
{
   // ...
}
public class insSerialNo : IObjectWithId
{
   // ...
}

public class YourContainerClass
{
   public static void DeleteCollectionDataRow<T>(IMongoCollection<T> collection, T t) where T : IObjectWithId
   {
      collection.DeleteOne(b => b._id.Equals(t._id));
   }
}

Это также предполагает, что вы правильно реализовали IEquatable<T> интерфейс в вашем ObjectId определение класса/структуры.

Вы также можете переосмыслить свою схему именования, поскольку она не очень хорошо вписывается в нее .Чистый мир, но это скорее "косметическое" замечание выбора, которое вы можете игнорировать, в конце концов.

Надеюсь, это поможет. Любезно.