Подтвердить что ты не робот

Сравнение типов объектов С#

Как я могу сравнить типы двух объектов, объявленных как тип.

Я хочу знать, имеют ли два объекта одного типа или одного и того же базового класса.

Любая помощь приветствуется.

например.

private bool AreSame(Type a, Type b) {

}
4b9b3361

Ответ 1

Скажите a и b - это два объекта. Если вы хотите увидеть, находятся ли a и b в одной иерархии наследования, используйте Type.IsAssignableFrom:

var t = a.GetType();
var u = b.GetType();

if (t.IsAssignableFrom(u) || u.IsAssignableFrom(t)) {
  // x.IsAssignableFrom(y) returns true if:
  //   (1) x and y are the same type
  //   (2) x and y are in the same inheritance hierarchy
  //   (3) y is implemented by x
  //   (4) y is a generic type parameter and one of its constraints is x
}

Если вы хотите проверить, является ли один из базовых классов другого, попробуйте Type.IsSubclassOf.

Если вы знаете конкретный базовый класс, просто используйте ключевое слово is:

if (a is T && b is T) {
  // Objects are both of type T.
}

В противном случае вам нужно будет напрямую пройти иерархию наследования.

Ответ 2

Там немного проблема с этой идеей, поскольку каждый объект (и, действительно, каждый тип) имеет общий базовый класс Object. То, что вам нужно определить, - это то, насколько далеко вы наследуете цепочку наследования (независимо от того, являются ли они одинаковыми или имеют одного и того же непосредственного родителя, или один из них является непосредственным родителем другого и т.д.) И проверяет этот путь. IsAssignableFrom полезен для определения совместимости типов друг с другом, но не будет полностью установлен, если у них есть один и тот же родительский элемент (если это то, что вам нужно).

Если ваши строгие критерии заключаются в том, что функция должна возвращать true, если...

  • Типы идентичны
  • Один тип - это родительский (немедленный или другой) другой
  • Два типа имеют один и тот же непосредственный родительский

Вы можете использовать

private bool AreSame(Type a, Type b) 
{
    if(a == b) return true; // Either both are null or they are the same type

    if(a == null || b == null) return false; 

    if(a.IsSubclassOf(b) || b.IsSubclassOf(a)) return true; // One inherits from the other

    return a.BaseType == b.BaseType; // They have the same immediate parent
}

Ответ 3

Вы также можете использовать ключевое слово "IS", если вы ожидаете, что два экземпляра объекта имеют определенный тип. Это также будет работать для сравнения подклассов с родительскими классами, а также с классами, реализующими интерфейсы и т.д. Это не будет работать для типов типа Type.

if (objA Is string && objB Is string)
// they are the same.

public class a {}

public class b : a {}

b objb = new b();

if (objb Is a)
// they are of the same via inheritance

Ответ 4

Я попробовал следующее с иерархией, используя оба интерфейса и конкретные классы. Он подходит к цепочке базового класса для одного из типов до тех пор, пока не достигнет "объекта", в котором мы проверяем, назначен ли текущий тип назначения для типа источника. Мы также проверяем, имеют ли типы общий интерфейс. если они это сделают, то они "AreSame"

Надеюсь, что это поможет.

 public interface IUser
{
     int ID { get; set; }
     string Name { get; set; }
}

public class NetworkUser : IUser
{
    public int ID
    {
        get;
        set;
    }

    public string Name
    {
        get;
        set;
    }
}

public class Associate : NetworkUser,IUser
{
    #region IUser Members

    public int ID
    {
        get;
        set;
    }

    public string Name
    {
        get;
        set;
    }

    #endregion
}

public class Manager : NetworkUser,IUser
{
    #region IUser Members

    public int ID
    {
        get;
        set;
    }

    public string Name
    {
        get;
        set;
    }

    #endregion
}


public class Program
{

    public static bool AreSame(Type sourceType, Type destinationType)
    {
        if (sourceType == null || destinationType == null)
        {
            return false;
        }

        if (sourceType == destinationType)
        {
            return true;
        }

        //walk up the inheritance chain till we reach 'object' at which point check if 
    //the current destination type is assignable from the source type      
    Type tempDestinationType = destinationType;
        while (tempDestinationType.BaseType != typeof(object))
        {
            tempDestinationType = tempDestinationType.BaseType;
        }
        if( tempDestinationType.IsAssignableFrom(sourceType))
        {
            return true;
        }

        var query = from d in destinationType.GetInterfaces() join s in sourceType.GetInterfaces()
                    on d.Name equals s.Name
                    select s;
        //if the results of the query are not empty then we have a common interface , so return true 
    if (query != Enumerable.Empty<Type>())
        {
            return true;
        }
        return false;            
    }

    public static void Main(string[] args)
    {

        AreSame(new Manager().GetType(), new Associate().GetType());
    }
}