2011-03-22 5 views
8

좋아, 나는 여기에서 서사시를 실패 할 것이지만 내 마음은 이것이 효과가있다라고 말하고 싶어한다.자기에게 비 직렬화

DataProtect.DecryptData는 암호화 된 문자열을 입력으로 사용하고 암호 해독 된 문자열을 출력으로 가정합니다. deserializeXML이 적절한 객체를 만들고 새로 해독 된 문자열에서 반환한다고 가정합니다.

So. 왜이게 효과가 없을까요?

class ArrivedDetails 
{ 
///... 

    internal ArrivedDetails(string encrypted) 
    { 
     this = DataProtect.deserializeXML(DataProtect.DecryptData(encrypted)); 
    } 
///... 

내가이 작업을 얻을 수있는 방법 ,, 나에게 구체적으로
Cannot assign to '<this>' because it's read only 

의 오류를 준다? 본질적으로 객체의 XML 직렬화 된 버전을 해독 한 다음 생성자 내에서 직렬화 해제하려고합니다.

나는 다른 곳에 넣고 값을 지정할 수 있기 때문에 "설명 할 수 없다"는 것에 열중하지만, 내 마음은 이것이 가능해야한다고 말합니다.

답변

12

아니요, 생성자를 사용할 수 없으므로 this을 다시 할당 할 수 없습니다.

public static ArrivedDetails CreateFromString(string encrypted) 
{ 
    return DataProtect.deserializeXML(DataProtect.DecryptData(encrypted)); 
} 

전화를 :

ArrivedDetails details = ArrivedDetails.CreateFromString(encrypted); 
+0

원본 개념이 작동해야한다고 dotalchemy에 동의하지만 정적 메서드가 트릭을 수행합니다. 저는 여러분이 새로운 객체를 인스턴스화하지 않고 그냥 반환한다는 점을 좋아합니다. – Farhan

2

은 당신이 원하는 것은 당신이 필요로하는 객체를 생성하는 정적 팩토리 메소드입니다

대신 정적 방법을 사용합니다. this가 호출되는 객체를 반환하는 사설 읽기 전용 인스턴스 필드이기 때문에 초기 접근 방식은 작동하지 않았다

class ArrivedDetails 
{ 
///... 

    public static ArrivedDetails CreateFromEncryptedKey(string encrypted) 
    { 
     return DataProtect.deserializeXML(DataProtect.DecryptData(encrypted)); 
    } 
///... 

이유입니다. this에 글을 쓸 수 없습니다.

3

"this"에 아무 것도 지정할 수 없습니다. deserialised 개체를 반환하는 정적으로 ArriveDetails 변경하십시오.

class ArrivedDetails 
{ 
    static ArrivedDetails Create(string encrypted) 
    { return DataProtect.deserializeXML(...) } 
} 
3

다음과 같이이를 반영하여 보관할 수 있습니다.

A config = DataProtect.deserializeXML(DataProtect.DecryptData(encrypted)); 
foreach (var property in GetType().GetProperties()) 
    if (property.GetCustomAttributes(typeof (XmlIgnoreAttribute), false).GetLength(0) == 0) 
     property.SetValue(this, property.GetValue(tmp, null), null); 

이 임시 변수에 직렬화 된 객체를 할당 및 반사 this 각 공개 속성의 값을 복사한다. 이 조각은 XmlIgnore 특성으로 속성을 복사하지 않습니다.