在反射的帮助下使用泛型类访问具体类的属性

时间:2018-08-11 05:26:08

标签: c# generics reflection properties

我可以使用接口实现和依赖注入知识来做同样的事情,但是我只想知道这种情况下泛型的使用。

假设我有几个类,它们包含相同数量的相同类型的属性,并且在某些情况下,它也包含具有相同签名的相同方法。例如,称为Dog,Cat,Tiger等的类。现在,在operator类内有一个Main方法,将从该方法执行程序。

在上述情况下,如何使用泛型来简化代码,以便仅将所需的类作为参数传递来访问方法和基于特定类的get / set属性?

  

注意:我可以使用界面来做到这一点,但我不想这么做。

2 个答案:

答案 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;
}

(我不建议这样做。我在另一篇文章中评论说,您的朋友应该尝试使用部分类将接口应用于具有公共属性的类型。)