2009-12-08 3 views
0

질문에 올바르게 질문했는지 확실하지 않습니다. 내가 틀렸다면 나를 바로 잡아주세요.C#에서 참조로 속성을 전달하는 방법?

어쨌든 우리는 페이지 수명주기의 다른 단계에서 변수 값을 사용하고자합니다. 그래서 예를 들어

,

public partial class TestUserControl: UserControl{ 
    public TestUserControl(){ 
     Objects = new List<object>(){ 
      Property1, 
      Property2, 
      Property3 
     }; 
    } 

    public int Property1 { get; set; } 
    public bool Property2 { get; set; } 
    public string Property3 { get; set; } 
    public List<object> Objects { get; set; } 

    protected override OnLoad(EventArgs e){ 
     foreach(var item in Objects){ 
      Page.Controls.Add(new LiteralControl(item.ToString() + "<br/>")); 
     } 
    } 
} 

그래서 우리는 그들이 태그에 기록 된대로 속성 1, Property2, Property3의 값이 설정되어 말한다면, 어떻게 우리가 필요로 할 때 같은 속성 '값을 사용할 수 있을까?

생성자에서 속성 값 대신 목록에 나열된 속성 이름 만 나열되어 현재 값이 OnLoad에 사용됩니다.

고마워요.


편집 : 나는 deerchao 년대와 존의 접근 방식을 채택했지만, 그것은 같은입니다 ... 우리가 직면 할 또 다른 문제가있는 것 같다

public partial class TestUserControl: UserControl{ 
    public TestUserControl(){ 
     Objects = List<Func<object>>{ 
      () => Property1, 
      () => Property2, 
      () => Property3 
     }; 
    } 

    public int Property1 { get; set; } 
    public bool Property2 { get; set; } 
    public string Property3 { get; set; } 
    public List<Func<object>> Objects { get; set; } 

    protected override OnLoad(EventArgs e){ 
     foreach (var item in Objects) { 
      //Here is the problem... can we get the variable name using this approach? 
      //We have tried some other ways like reflection and expressions but to no avail. Help please =) 
      string key = GetVariableName(item()); 

      string value = item() == null ? string.Empty : item().ToString(); 
      Page.Controls.Add(new LiteralControl(key + " : " + value + "<br/>")); 
     } 
    } 
} 
+0

나는이 세 번 읽었는데, 나는 아직도 네가하려는 것을 이해하지 못하고, 지나가는 것과 관련이 있는지도 모른다. – jason

+1

제이슨, 나는 참고 사항이 부주의 한 재현이라고 생각합니다. 어쩌면 내가 잘못 읽었지만, Jronny가 item.ToString()의 결과에 만족하지 않는 것처럼 들립니다. 하지만 제발 마음에 두십시오. – peacedog

+0

저는 질문의 제목을 그가 묻고있는 것으로 바꿨습니다. 그것이 틀린 경우 다시 변경하십시오. – dtb

답변

6

당신은 (ref 사용)을 참조하여 변수 아니지만 속성을 전달할 수있다. 또한 "ref-ness"는 메소드의 지속 기간 동안 만 사용됩니다. 인수와 매개 변수의 별칭이지만 다른 변수에 매개 변수 값을 복사하면 다른 변수는 별칭이 아닙니다.

그것은 당신이하고 싶은 정확히 정말 분명 아니지만, 대신 사용 대표자 : 다음

Objects = new List<Func<object>>(){ 
     () => Property1, 
     () => Property2, 
     () => Property3 
    }; 

:

protected override OnLoad(EventArgs e){ 
    foreach(var itemRetriever in Objects){ 
     Page.Controls.Add(new Literal(itemRetriever().ToString() + "<br/>")); 
    } 
} 

그것은 그래도 꽤 불쾌한입니다 - 내가 시도 할 것 가능한 경우 대체 설계를 찾으십시오.

+0

존 : OP의 질문은 참조로 전화하는 것과 관련이 없다고 생각합니다. 내가 이해할 수있는 질문은 대부분 ASP.NET이 마크 업에서 선언 된 사용자 정의 컨트롤을 인스턴스화하는 방식과 관련이 있습니다. –

+0

@Mehrdad : 나는 확신하지 못한다. 나는 그가 나중에 주어진 순서대로 속성에 접근 할 수 있기를 원한다고 생각한다. 그것은 매우 분명하지 않습니다. –

+0

여기에서 Jon이 부분적으로 정확합니다.기본적으로 OnLoad 이벤트의 속성 값을 얻고 싶습니다. – Jronny

0

당신이하면 다음과 같이 ToString()를 오버라이드 (override) 할 필요가 당신의 (Object) 클래스를 사용하여 값을 반환합니다. 또는 값에 직접 액세스 할 수있는 메서드 나 속성을 제공하십시오.

FWIW는 참조로 변수를 전달하는 것과 아무 관련이 없습니다.

+0

그건 내 문제의 일부가 아니지만. 이 코드를 작성하여 코드를 단순화했습니다. 어쨌든 고마워. – Jronny

+0

내가 오해하면 사과드립니다. – peacedog

+0

문제 없습니다. Answer =) – Jronny

3

진심으로 이상한 코드,하지만 방법에 대한 :

public partial class TestUserControl: UserControl{ 
    public TestUserControl(){ 

    } 

    public int Property1 { get; set; } 
    public bool Property2 { get; set; } 
    public string Property3 { get; set; } 
    public List<object> Objects { get; set; } 

    protected override OnLoad(EventArgs e){ 
     Objects = new List<object>(){ 
      Property1, 
      Property2, 
      Property3 
     }; 

     foreach(var item in Objects){ 
      Page.Controls.Add(new Literal(item.ToString() + "<br/>")); 
     } 
    } 
} 
+0

실제로 더 복잡한 코드가 있지만 여기서는 문제를 해결하는 것입니다. 생성자에는 꽤 많은 작업이 있었기 때문에 이미 객체 목록을 이미 설정하려고합니다. – Jronny

1
public partial class TestUserControl: UserControl{ 
public TestUserControl(){ 
    Objects = new List<Func<object>>(){ 
     () => Property1, 
     () => Property2, 
     () => Property3 
    }; 
} 

public int Property1 { get; set; } 
public bool Property2 { get; set; } 
public string Property3 { get; set; } 
public List<Func<object>> Objects { get; set; } 

protected override OnLoad(EventArgs e){ 
    foreach(var item in Objects){ 
     Page.Controls.Add(new Literal(item().ToString() + "<br/>")); 
    } 
} 

}

+0

나중에 다시 시도하겠습니다. – Jronny

1

가 아마의 PropertyDescriptor를 사용할 때 통과하는 ref 키워드 (들) System.ComponentModel에서

System.ComponentModel.PropertyDescriptorCollection properties = System.ComponentModel.TypeDescriptor.GetProperties(this); 
0

이렇게 할 수는 없지만 몇 가지 대안이 있습니다.

공공 부분 클래스 TestUserControl : UserControl을 {

public int Property1 { get; set; } 
public bool Property2 { get; set; } 
public string Property3 { get; set; } 
public IEnumerable<object> Objects 
{ 
    get 
    { 
     yield return Property1; 
     yield return Property2; 
     yield return Property3; 
    } 
} 

}

그것은 목록 아니지만, 당신은 아직도 그것을 통해 열거 할 수 있습니다 예를 들어. IList 래퍼를 작성할 수도 있지만 길이가 길어집니다. 내가 올바르게 이해하고 가정

+0

우리가 생성자에있는 동안 객체의'get' 부분을 설정할 수 있습니까? – Jronny

+0

속성은 실제로 메서드의 구문 설탕입니다. 당신이 가지고있는 것은 get과 set의 두 가지 방법입니다. 그래서 당신이 가질 수있는 최고의 참고 자료는 대의원입니다. 어쨌든,이 솔루션의 문제점은 무엇입니까? –

+0

생성자의 Object에 나열 할 속성을 지정해야합니다. – Jronny

0

좋아, ...

표시되는 값은 "오래된"데이터가 있습니다. 페이지 수명주기의 후반부에 변경되는 데이터입니다. 즉 올바른 가정

, 당신은 단지 출력 스트림에 문자열을 쓸 것,

대신 리터럴 컨트롤을 추가 (내 머리의 상단을 기억할 수없는, 또는 동급)의 OnRender에의 OnLoad 변경

가 도움을합니까 (또는 문자열이? 다시 ... 한 동안 이런 일을하지 않은)?

--Edit--

좋아, 내가 마지막으로 당신이 뭘 하려는지 이해합니다. 나는 heh라고 생각한다.

리플렉션을 사용해야합니다.

PropertyInfo[] props = typeof(TestUserControl).GetProperties(BindingFlags.Public); 

그러면 TestUserControl의 Public Properties를 모두 사용할 수 있습니다. 다음의 OnLoad 사용하여 객체 배열에 그 보관 :

object o = props[0].GetValue(this, null); 

값을 얻을 수 있습니다.

도움이 되셨습니까? :)

+0

글쎄, literalcontrols 또는 문자열에는 문제가 없습니다. PreInit에서 Unload 로의 여부와 관계없이 List에 보관 된 데이터 일 수도 있습니다. 따라서 나열 할 데이터 대신 필요한 속성을 유지해야합니다. =) – Jronny

+0

음, 가능한 한 많이 여기에서 Reflection을 사용하고 싶지는 않습니다 ... 게다가 특정 속성 만 필요하므로 모든 공개 속성을 얻는 것은 방법이 아닙니다. 감사. =) – Jronny

+0

리플렉션을 사용하지 않고 나는 헷 (heh)을 모른다. 특정 속성 만 가져 오는 것과 관련하여 특성을 사용하여 사용할 속성을 결정할 수 있습니다. 내 편집이 원하는 작업이라면 컴파일 할 때 모르는 속성을 가져 오는 기본 클래스를 올바르게 작성하려고하기 때문에 어떤 방식으로도 반영하지 않을 수 없습니다. – TJMonk15

관련 문제