Programing

C # 개체 유형 비교

crosscheck 2020. 12. 11. 07:50
반응형

C # 개체 유형 비교


유형으로 선언 된 두 개체의 유형을 어떻게 비교할 수 있습니까?

두 개체가 동일한 유형인지 또는 동일한 기본 클래스인지 알고 싶습니다.

도움을 주시면 감사하겠습니다.

예 :

private bool AreSame(Type a, Type b) {

}

ab두 개체입니다. ab같은 상속 계층 구조에 있는지 확인하려면 다음을 사용하십시오 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.
}

그렇지 않으면 상속 계층 구조를 직접 걸어야합니다.


하지만 모든 객체 (실제로 모든 유형)가 공통 기본 클래스 인 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
}

두 개체 인스턴스가 특정 유형일 것으로 예상되는 경우 "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

인터페이스와 구체적인 클래스를 모두 사용하는 계층 구조로 다음을 시도했습니다. 현재 대상 유형이 소스 유형에 할당 가능한지 확인하는 "객체"에 도달 할 때까지 유형 중 하나에 대한 기본 클래스 체인을 걸어갑니다. 또한 유형에 공통 인터페이스가 있는지 확인합니다. 그렇다면 그들은 '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());
    }
}

참고 URL : https://stackoverflow.com/questions/708205/c-sharp-object-type-comparison

반응형