C # 개체 유형 비교
유형으로 선언 된 두 개체의 유형을 어떻게 비교할 수 있습니까?
두 개체가 동일한 유형인지 또는 동일한 기본 클래스인지 알고 싶습니다.
도움을 주시면 감사하겠습니다.
예 :
private bool AreSame(Type a, Type b) {
}
말 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.
}
그렇지 않으면 상속 계층 구조를 직접 걸어야합니다.
하지만 모든 객체 (실제로 모든 유형)가 공통 기본 클래스 인 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
'Programing' 카테고리의 다른 글
asp.net MVC 4 및 Razor보기에서 경로의 이미지를 표시하는 방법은 무엇입니까? (0) | 2020.12.11 |
---|---|
원격 .NET 디버거가 연결될 때까지 기다리는 방법 (0) | 2020.12.11 |
= *는 무엇을 의미합니까? (0) | 2020.12.11 |
MySQL : INT를 DATETIME으로 변환 (0) | 2020.12.11 |
표 셀에서 링크를 만들 수있는 방법 (0) | 2020.12.11 |