我可以使用接口实现和依赖注入知识来做同样的事情,但是我只想知道这种情况下泛型的使用。
假设我有几个类,它们包含相同数量的相同类型的属性,并且在某些情况下,它也包含具有相同签名的相同方法。例如,称为Dog,Cat,Tiger等的类。现在,在operator类内有一个Main方法,将从该方法执行程序。
在上述情况下,如何使用泛型来简化代码,以便仅将所需的类作为参数传递来访问方法和基于特定类的get / set属性?
注意:我可以使用界面来做到这一点,但我不想这么做。
答案 0 :(得分:0)
是,可以选择“反射”,但不建议这样做,因为它会占用很多内存。
看到这个大概你可以尝试这种方式,
class MainApp
{
static void Main()
{
Cat cat = new Cat(4, "Black", true, "White");
Tiger tiger = new Tiger(4, "Black", true, "Yellow");
Cow cow = new Cow(4, "Black", true, "Black");
}
}
public class Animal
{
public int Legs { get; set; }
public string EyeColour { get; set; }
public bool Tail { get; set; }
public string SkinColour { get; set; }
public Animal(int legs, string eyeColour, bool tail, string skinColour)
{
this.Legs = legs;
this.EyeColour = eyeColour;
this.Tail = tail;
this.SkinColour = skinColour;
}
}
public class Cat : Animal
{
public Cat(int legs, string eyeColour, bool tail, string skinColour)
: base(legs, eyeColour, tail, skinColour)
{
}
public int MyPropertyCat { get; set; }
}
public class Tiger : Animal
{
public Tiger(int legs, string eyeColour, bool tail, string skinColour)
: base(legs, eyeColour, tail, skinColour)
{
}
public int MyPropertyForTiger { get; set; }
}
public class Cow : Animal
{
public Cow(int legs, string eyeColour, bool tail, string skinColour)
: base(legs, eyeColour, tail, skinColour)
{
}
public int MyPropertyForCow { get; set; }
}
}
答案 1 :(得分:-1)
在这种情况下,泛型并不是一个很好的选择。您所寻找的就是所谓的鸭子打字,而在C#中最能得到的就是使用dynamic关键字。
public void FillAddress(string type)
{
if (_addressDetails == null) throw new Exception($"{nameof(_addressDetails)} must not be null.");
dynamic details = _addressDetails;
dynamic addressSource;
if (type == "Manager")
{
addressSource = _manager;
}
else if (type == "TeamLead")
{
addressSource = _teamLead;
}
else if (type == "Employee")
{
addressSource = _employee;
}
else
{
throw new ArgumentException("Unrecognized type", nameof(type));
}
details.AddressLine1 = addressSource.AddressLine1;
details.AddressLine2 = addressSource.AddressLine2;
details.AddressLine3 = addressSource.AddressLine3;
}
(我不建议这样做。我在另一篇文章中评论说,您的朋友应该尝试使用部分类将接口应用于具有公共属性的类型。)