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



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



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



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



например



private bool AreSame(Type a, Type b) {

}
964   4  

4 ответов:

сказать 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.
}

в противном случае, вам придется ходить по иерархия наследования напрямую.

IsAssignableFrom полезно для определения совместимости типов друг с другом, но не будет полностью установить, если они имеют тот же родитель (если это то, что вам нужно).

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

  • типы идентичны
  • один тип является родителем (непосредственным или иным) другого
  • два типа имеют один и тот же непосредственный родитель

вы могли бы использовать

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
}

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

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

я попробовал следующее с иерархией, используя как интерфейсы, так и конкретные классы. Он идет вверх по цепочке базовых классов для одного из типов, пока не достигнет "объекта", в котором мы проверяем, можно ли назначить текущий тип назначения исходному типу. Мы также проверяем, имеют ли типы общий интерфейс. если они это делают, то они '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());
    }
}

Comments

    Ничего не найдено.