0

HttpWebRequest.Create (URL)를 통해의 HttpWebRequest를 사용있다 :과 같이 사용될 수있다 이제이HttpWebRequest를 수집 이니셜 C 번호

class RequestLight 
{ 
    public HttpWebRequest WebRequestObj; 

    public RequestLight(string url) 
    { 
     WebRequestObj = HttpWebRequest.CreateHttp(url); 
    } 

} 

은 (Webreq 객체에 대한 객체 이니셜 라이저의 효과)

var obj = new RequestLight("http://google.com") 
       { WebRequestObj = { CookieContainer = null } }.WebRequestObj; 

누락 된 것이 있습니까? 아니면 원하는 효과를 얻는 가장 쉬운 방법입니까?

참고 : 원래 방법을 사용하여 정적 메서드를 통해 개체를 만든 다음 각 속성을 하나씩 할당해야합니다.

+0

당신은 컬렉션 이니셜 라이저가 아니라 개체 이니셜 라이저를 의미합니다. 하지만 처음에는 'RequestLight'가있는 이유가 명확하지 않습니다. 왜 그냥 두 가지 진술을하지 않습니까? 'var request = HttpWebRequest.CreateHttp (url); request.CookieContainer = null; ' –

+0

네, 객체 초기화 프로그램을 의미했습니다. 그리고 이것은 편의를위한 것입니다 (그리고 객체 이니셜 라이저는 다루기가 훨씬 깔끔합니다). 작성된 응용 프로그램 및 도구는 모두 웹 속성을 분석하므로 요청을 최적의 방법으로 초기화해야합니다. – Curtis

+0

하나의 표현식에서 처리해야하는 상황에있는 경우 * 객체 *를 처리하기위한 객체 초기화 프로그램이 더 깨끗합니다. 그러나 일반 로컬 변수 인 경우 두 구문보다 구문이 상당히 * 덜 * 편리하다고 말할 수 있습니다. 내 대답의 제안은 다소 덜 분명하지 않지만, 나는 (그리고 더 일반적인) 생각하지만 대부분의 경우 두 문장을 여전히 사용하고있을 것이다. –

답변

1

단일 명령문에서 요청을 초기화하는 방법을 찾고있는 것 같습니다. 그렇지 않으면 두 명령문을 사용하는 것이 더 간단합니다. -

이에 합리적으로 간단한 대안 람다 표현식을 사용하여, 거기에

꽤 불쾌한 비록 ...

public static class Extensions 
{ 
    public static T Initialize<T>(this T value, Action<T> initializer) where T : class 
    { 
     initializer(value); 
     return value; 
    } 
} 

그리고 그것을 호출

var request = WebRequest.CreateHttp(uri) 
    .Initialize(x => x.CookieContainer = null); 

또는 여러 속성 :

var request = WebRequest.CreateHttp(uri).Initialize(x => { 
    x.CookieContainer = null; 
    x.Date = DateTime.UtcNow; 
});