문제

나는 클래스의 유형 (또는 인스턴스)과 함께 표현식 트리를 매개 변수로 받아들이는 메소드를 연구하고 있습니다.

기본 아이디어는이 방법이 유효성 검사에 사용될 컬렉션에 특정 사항을 추가한다는 것입니다.

public interface ITestInterface
{
    //Specify stuff here.
}

private static void DoSomething<T>(Expression<Func<T, object>> expression, params IMyInterface[] rule)
{
    // Stuff is done here.
}

이 방법은 다음과 같이 불립니다.

class TestClass
{
    public int MyProperty { get; set; }
}

class OtherTestClass  : ITestInterface
{
    // Blah Blah Blah.
}

static void Main(string[] args)
{
    DoSomething<TestClass>(t => t.MyProperty, 
        new OtherTestClass());
}

전달 된 속성 이름이 강한 입력을 원하기 때문에 이런 식으로하고 있습니다.

내가 어려움을 겪고있는 몇 가지 ..

  1. 복용량 내에서 나는 a를 얻고 싶다 PropertyInfo t의 몸통 (통과 된 본체에서)을 입력하고 규칙 []와 함께 컬렉션에 추가하십시오. 현재, 나는 표현식을 사용하고 "convert. ([propertyname])에서 [propertyname]을 제거하고 반사를 사용하여 필요한 것을 얻는 것에 대해 생각하고 있습니다. 이것은 번거롭고 틀린 것 같습니다. 더 좋은 방법이 있습니까?
  2. 이것이 내가 사용하는 특정 패턴입니까?
  3. 마지막으로, 내가하는 일에 대한 나의 오해에 대한 제안이나 설명은 감사하고 / 또는 C# 표현 나무에 대한 자원 또는 좋은 정보도 감사합니다.

감사!

이안

편집하다:

무엇의 예 expression.Body.ToString() DOSOMething 메소드 내의 반환은 위의 예에서 호출 된 경우 "Convert (t.myproperty)"를 포함하는 문자열입니다.

강력하게 입력해야하므로 속성 이름을 변경하면 컴파일하지 않습니다.

제안 해주셔서 감사합니다!

도움이 되었습니까?

해결책

expression.body에서 객체를 수집하는 것은 비슷해 보입니다 내 해결책 또 다른 질문에.

다른 팁

나는 표현 나무에 크게 의존하여 현재 응용 프로그램과 함께하고 싶은 많은 일을 컴파일 타임, 즉 정적 유형 검사에 밀어 넣습니다.

나는 표현 나무를 가로 지르며 "이해가 된"다른 것으로 번역합니다.

내가 많이 수행 한 한 가지는 URL 대신 Lambda 기능을 선언하는 접근 방식과 같은 MVC에 의존하고 컴파일러가 URL로 발현 된 컴파일러를 해석합니다. 이 URL이 호출되면 반대입니다. 이런 식으로, 나는 깨진 링크에 대한 컴파일 타임 검사라고 부르는 것을 가지고 있으며, 이것은 리팩토링 및 과부하와도 잘 작동합니다. 이런 식으로 표현 나무를 사용하는 것이 멋지다고 생각합니다.

방문자 패턴을 확인하고 싶을 수도 있습니다. 처음에는 의미가 없기 때문에 시작하는 것이 고통 스럽지만 모든 것을 함께 묶고 컴파일러 구성에서 유형 검사를 해결하는 매우 공식적인 방법입니다. 당신은 똑같이 할 수 있지만 유형 확인 대신에 필요한 것을 방출합니다.

내가 현재 내 머리를 두드리고있는 것은 표현 용기를 번역하고 자바 스크립트를 방출하기위한 간단한 프레임 워크를 구축하는 능력입니다. 아이디어는 컴파일러 생성 식 트리가 일부 객체 모델과 인터페이스하는 유효한 JavaScript로 변환된다는 것입니다.

이것에 대한 흥미로운 점은 컴파일러가 내가 잘못 될 때 항상 말해 줄 수있는 방법입니다. 최종 결과는 많은 문자열 일 뿐이지 만 중요한 부분은 이러한 문자열이 어떻게 만들어 졌는지입니다. 그들은 약간의 검증을 겪었고 그것은 무언가를 의미합니다.

일단 당신이 그 일을하게되면, 당신은 표현 나무로 할 수 없습니다.

System.reflection.Emit와 함께 작업하는 동안 표현 트리를 사용하여 동적 컴파일을위한 가벼운 프레임 워크를 만들기 위해 나 자신을 발견했는데, 컴파일 시간에는 기본적으로 동적으로 생성 된 어셈블리가 컴파일 될 것인지 기본적으로 말할 수 있으며, 이는 반사와 완벽하게 작동했습니다. 정적 유형 확인. 그것은 이것을 더 멀어지고 결국 많은 시간을 절약했으며 매우 민첩하고 강력한 것으로 판명되었습니다.

그래서 저는 이런 종류의 것들을 좋아합니다. 이것이 Meta 프로그래밍에 관한 것입니다. 프로그램을 수행하는 프로그램에 프로그램을 작성합니다. 나는 계속오고 있다고!

나는 당신이 여기서 재산으로하려는 일에 감사드립니다. 나는이 수수께끼에 빠졌다. 글을 쓰는 것이 항상 이상하다고 느낍니다.

DoSomething("MyProperty", new OtherClass());

속성이 이름이 변경되거나 텍스트가 통화에 착각되면 문제가 발생합니다. 내가 배우게 된 것은 이것이 아마도 테스트를 통해 처리해야 할 것입니다. 특히 단위 테스트. "DoSomething"호출이 올바르게 작동한다는 것을 시행하기 위해 단위 테스트를 작성합니다.

당신이 시도 할 수있는 또 다른 것은 속성으로 속성을 장식 한 다음 속성이있는 속성을 찾고로드 규칙을 찾을 때 클래스에 대해 반영하는 것입니다.

[DoSomething(typeof(OtherClass), typeof(OtherClass2))]
public int MyProperty
{
  get;
  set;
}

이 경우 생성자 (아마도 기본 클래스에서?)는 다른 클래스 객체와 다른 Class2 객체를 동적으로 생성하고 속성 이름과 함께 컬렉션에로드합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top