다른 개체에서 상속 할 수도 있고 상속하지 않을 수도 있지만 인터페이스를 구현할 것이므로 IMyInterface라고 부를 수 있습니다.
public interface IMyInterface {
long MyPropertyName { get; set; }
}
객체는 항상이 인터페이스를 구현하지만 객체가 상속하는 클래스에서 구현되었을 수 있습니다. 이 인터페이스가 구현 된 클래스의 이름을 어떻게 얻을 수 있습니까?
예제는 이러한 결과를 제공해야합니다.
public class MyClass : IMyInterface {
}
public class MyHighClass : MyClass {
}
public class MyPlainClass {
}
public class PlainInheritedClass : MyPlainClass, IMyInterface {
}
MyClass를 전달하면 MyClass가 인터페이스를 구현하므로 MyClass를 반환해야합니다.
MyHighClass를 전달하면 MyClass가 상속되어 인터페이스를 구현하기 때문에 MyClass를 반환해야합니다.
PlainInheritedClass를 전달하면 MyPlainClass에서 상속 되었기 때문에 PlainInheriedClass를 반환해야하지만 인터페이스를 구현하지 않았으므로 PlainInheritedClass가 수행했습니다.
편집 / 설명
엔티티 프레임 워크 6으로 작업하고 있습니다. 사용자가 데이터베이스에서 데이터를 삭제할 수 있도록하는 일종의 휴지통 기능을 만들었지 만 실제로는 숨길뿐입니다. 이 기능을 사용하려면 엔터티가 특정 속성을 가진 인터페이스를 구현해야합니다.
내 엔티티의 대부분은 아무것도 상속하지 않고 인터페이스를 구현합니다. 하지만 다른 개체에서 상속하는 몇 가지 엔터티가 있습니다. 때로는 상속받은 객체가 인터페이스를 구현하고 때로는 객체 자체가 인터페이스를 구현합니다.
값을 설정할 때 엔티티 및 엔티티 프레임 워크를 사용하여 업데이트 할 테이블을 결정합니다. 하지만 속성을 "설정 해제"하면 내 SQL 문을 사용하고 있습니다. 나만의 SQL 문을 만들려면 업데이트해야하는 열이있는 테이블을 찾아야합니다.
.Where
제네릭 DbSet 클래스에 존재하지 않기 때문에 엔터티 프레임 워크를 사용하여 형식 만 기반으로 엔터티를로드 할 수 없습니다 .
그래서 나는 이와 비슷한 SQL 문을 만들고 싶습니다.
UPDATE tableX SET interfaceProperty = NULL WHERE interfaceProperty = X
나는 모든 것을 생각하고 있었는데, 기능은 매우 쉬웠다. 누군가가 은밀한 무언가를 필요로한다면 여기에 있습니다. 대신 항상 확장으로 만들 수 있습니다.
코드는 기본 클래스까지 계속해서 삽입 된 다음 트리를 통해 백업되는 동안 각 클래스를 확인합니다.
public Type GetImplementingClass(Type type, Type interfaceType)
{
Type baseType = null;
// if type has a BaseType, then check base first
if (type.BaseType != null)
baseType = GetImplementingClass(type.BaseType, interfaceType);
// if type
if (baseType == null)
{
if (interfaceType.IsAssignableFrom(type))
return type;
}
return baseType;
}
그래서 저는 이것을 예를 들어 이렇게 불러야했습니다.
// result = MyClass
var result = GetClassInterface(typeof(MyClass), typeof(IMyInterface));
// result = MyClass
var result = GetClassInterface(typeof(MyHighClass), typeof(IMyInterface));
// result = PlainInheritedClass
var result = GetClassInterface(typeof(PlainInheritedClass), typeof(IMyInterface));
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다