2011-09-07 5 views
4

간단한 질문이지만, 나는 가능하다고 생각하지 않지만 전에 놀랐다.유형을 언급하지 않고도 정적 함수를 호출 할 수있는 방법이 있습니까?

내가 수학 함수의 모든 종류의 도서관이, 아주 간단한 예를 들어 floorcap 걸릴 수 있습니다 : 다른 클래스에서 다른 방법으로

class MathLib { 
    public static double floorcap(double floor, double value, double cap) { 
     return Math.Min(Math.Max(floor, value), cap); 
    } 
} 

을, 난 그냥 입력하고 싶습니다

var mat_adjusted = floorcap(1, maturity, 5); 

하지만이 클래스에서는 선언되지 않았기 때문에 작동하지 않습니다. 라이브러리에 있습니다. 나를 입력하게합니다.

var mat_adjusted = MathLib.floorcap(1, maturity, 5); 

코드에 노이즈가 추가됩니다. 나는 그것을 단축 할 수 있었다.

using m = MyMathLibrary.MathLib; 

.. yadayada 

var mat_adjusted = m.floorcap(1, maturity, 5); 

그러나 아직도, 나는 클래스 이름을 항상 타이프하지 않아도되는 것을 좋아한다. 그게 가능하니? 나도 F # 코드를 작성하고 잠시 후에 타입/모듈 등을 철자하지 않아도된다. C#을 써야 할 때,이 일은 나를 괴롭 히고 있습니다.

여기에 많은 기능이 있습니다.이 점과 클래스 이름이 모두 중첩 된 몇 가지 기능을 호출해야 할 때가 있습니다. 나는 가능한 한 깨끗한 코드를 좋아한다. 사전에

감사합니다,

거트-월

+4

예, 동일한 클래스의 메소드를 사용하십시오. :) – ChaosPandion

+1

점 표기법에 왜 그런 문제가 있는지 잘 모르겠습니다.'MathLib.FloorCap (1, 2, 3)'은 제게 매우 깨끗해 보입니다. –

+0

actaully는 확장 메서드와 '로컬 래퍼'를 모두 고려했지만 예제에서는 해당 메서드를 사용하지 않았습니다. 래퍼는 많은 오버 헤드를 추가합니다. 확장 메소드는 코드도 복잡하게 만듭니다. 요점은 프로그래머가 아닌 프로그래머가 작성한 코드가 가능한 한 많이 보일 것입니다. – gjvdkamp

답변

5

아니,이 수 없습니다 - 그것은 일의 범위 내에서 를있는 경우는 (분명히있는 위치의 범위에 자격이되어야한다 귀하의 현재 상황, 그럼 당신은 할 수 있지만 질문과 목적의 요점을 놓치지 마십시오.) 어떤 종류보다 더 높은 직접적인 삶은 아무것도 없기 때문에 이것은 "글로벌 콜"에 대한 감각이 없습니다. 말하다.

+0

Downvoter, downvote에 대한 이유를 입력하십시오 –

+2

여기에 적용됩니다 ... – ChaosPandion

+2

실제로 downvote는 궁금했지만, meh. –

1

입력시 저장하지 않으려면 메서드 스텁을 복사하여 각 클라이언트 클래스에 붙여 넣을 수 있습니다.

private static double floorcap(double floor, double value, double cap) { 
    return MathLib.floorcap(floor, value, cap); 
} 
+0

+1 내가 정확히 무슨 말을하려고했는지. 아마 개인적으로 만들어야합니다. – Daniel

+0

@ 대니얼 - 나는 내 생각에 그 생각을 가지고있었습니다. – ChaosPandion

+2

이것은 유지 보수의 악몽입니다. –

3

이렇게하는 한 가지 방법은 대신 확장 방법을 만드는 것입니다. 당신이 정적 클래스에 예를 들어 함수를 정의하는 경우 예를 들어, :

static class MathLib 
{ 
    public static double floorcap(this double value, double floor, double cap) 
    { 
     return Math.Min(Math.Max(floor, value), cap); 
    } 
} 

그런 다음 당신은 다음과 같이 사용할 수 있습니다 :

var mat_adjusted = maturity.floorcap(1, 5); 
+0

여전히 자격을 부여해야합니다. 즉, 정적 클래스 이름, 유형 이름, 자격있는 통화인지 여부입니다. –

+0

@ Mr. 실망 스럽네요 : 그렇지만 OP는 입력하기 쉬운 코드를 원하지 않았습니다. 이것은 정적 클래스 나 네임 스페이스로부터 아무런 잡음이 없다는 점에서, 거의 필요한 최소한의 코드와 라인을 원하는'floorcap (1, maturity, 5)'예제와 합리적으로 잘 맞 춥니 다. –

+0

@Ron Warholic, 맞습니다. 이제는 MathLib에 광범위하게 사용되는 함수가 몇 개 밖에 없으면 실제로 코드에서이 작업을 수행하지 않습니다. – InvisibleBacon

0

당신이 원하는 것 무엇 뭔가를 줄 수있는 유일한 방법 산술 유형을 확장하는 확장 메서드를 사용하는 것입니다 당신이 사용하려는 :

public static class MathLibExt { 
    public static double FloorCap(this double value, double floor, double cap) { 
    return Math.Min(Math.Max(floor, value), cap); 
    } 
} 

// call like 
var value = 25.0; 
var capped = value.FloorCap(1, 10); 
0

를 같은 당신의 리튬을 호출하는 모든 클래스의 private static 방법을 정의로이 작업을 수행 할 수있는 방법이있다 멍청한; 그러나, 나는 최선의 해결책은 단지 그것을 극복하고 매번 클래스 이름을 타이핑하는 것이라고 주장 할 것이다.

관련 문제