난 그냥 어제 유사한 문제가 있었다 :
Label myLabel = new Label();
this.RegisterName(myLabel.Name, myLabel);
우리는 쉽게 사용하여 이름 등록을 취소 할 수 있습니다 클래스 만들기. 나는이 질문을 보았고 의존성 등록을 등록 해제하는 실제 해결책이 없다는 것을 알아 차렸다. 그래서 Red Gate .NET Reflector을 사용하여 파고 들었습니다.
DependencyProperty.Register
오버로드를 살펴보면 모두 DependencyProperty.RegisterCommon
인 것으로 보입니다. 속성이 이미 DependencyProperty에 주위
DependencyProperty dp =
new DependencyProperty(name, propertyType, ownerType,
defaultMetadata, validateValueCallback);
defaultMetadata.Seal(dp, null);
//...Yada yada...
lock (Synchronized)
{
PropertyFromName[key] = dp;
}
두 개의 센터 DependencyProperty.PropertyFromName
, 해시 테이블을 등록하는
FromNameKey key = new FromNameKey(name, ownerType);
lock (Synchronized)
{
if (PropertyFromName.Contains(key))
{
throw new ArgumentException(SR.Get("PropertyAlreadyRegistered",
new object[] { name, ownerType.Name }));
}
}
번째 등록되면
먼저 확인 : 그 방법은 두 부분을 가진다. 나도 DependencyProperty.RegisteredPropertyList
(ItemStructList<DependencyProperty>
)을 알아 차렸다. 그러나 그것이 사용되는 곳을 보지 않고 있었다. 그러나, 안전을 위해, 나는 가능한 한 제거하려고 노력할 것이라고 생각했습니다.
그래서 종속성 속성을 "등록 취소"할 수있는 다음 코드를 작성했습니다.
private void RemoveDependency(DependencyProperty prop)
{
var registeredPropertyField = typeof(DependencyProperty).
GetField("RegisteredPropertyList", BindingFlags.NonPublic | BindingFlags.Static);
object list = registeredPropertyField.GetValue(null);
var genericMeth = list.GetType().GetMethod("Remove");
try
{
genericMeth.Invoke(list, new[] { prop });
}
catch (TargetInvocationException)
{
Console.WriteLine("Does not exist in list");
}
var propertyFromNameField = typeof(DependencyProperty).
GetField("PropertyFromName", BindingFlags.NonPublic | BindingFlags.Static);
var propertyFromName = (Hashtable)propertyFromNameField.GetValue(null);
object keyToRemove = null;
foreach (DictionaryEntry item in propertyFromName)
{
if (item.Value == prop)
keyToRemove = item.Key;
}
if (keyToRemove != null)
propertyFromName.Remove(keyToRemove);
}
"AlreadyRegistered"예외가 발생하지 않고 테스트를 실행하기에 충분했습니다. 그러나 은 프로덕션 코드에서이 코드를 사용하지 말 것을 강력히 권장합니다. MSFT가 종속성 속성을 등록 취소하는 공식적인 방법을 선택하지 않았을 가능성이 높습니다. 그 이유는 MSFT가 문제를 묻는 것일뿐입니다.
아주 좋은 일했다! 당신은 프로덕션 코드에서 사용하는 것을 원치 않지만 탐정 작업의 아주 좋은 직업입니다! –