나는 여전히 말할 수가 없습 무엇을하려고 노력하고 있습니다. 하지만 내가하기 위해 최선을 다하겠 쇼 당신이 어떤 물건입니다.
나는 이 문장 당신이 쓴: "최종 목적의 이면에 노출이 사전에 허용하는 다른 방법을 직접 읽기/쓰기/니다." 으로 가이드
부분적인 수준의 문제
제가 언급했듯이에서 같은 것은 없으로 부분적인 클래스입니다. Partial 키워드 간단히 나타내는 클래스에서 정의할 수 있습니다 더 이상 하나 파일입니다. 정의에 대한 규칙 클래스를 동일하게 유지,그것은 단지 어떤 클래스의 구성원에서 정의할 수 있습니다 하나의 파일로 다른 부분에서 다른 파일이 있습니다.
문제 당신은 여기에는 아무 것도 할 수 partial
키워드입니다.
당신의 두 //이 작동하지 않 노트
첫 번째 중 하나는 다음과 같습니다:
partial class ClassA
{
ExampleDictionary instanceOfDict = new ExampleDictionary();
instanceOfDict.Add(1, "Test1"); // This does not work
//other code
}
첫 번째 라인을 선언하고 개인원 분야 ClassA
이름 instanceOfDict
초기화합니다. 그 이유는 그것을 컴파일.
두 번째 라인을 넣어하려고 실행 가능한 코드(함수 호출)바로 위에 있는 수준 범위의 클래스입니다. 당신은 할 수 없습니다. 할 수 있습을 넣어 무리의 일에서 최고 수준의 범위는 클래스(예:필드,속성,방법,대리인,열거형,내부 클래스),하지만 당신은 수 있지 코드가 있다.
당신의 두 번째 문제는 다음과 같습니다:
public static void FunctionA()
{
for (int i = 0; i < 10; i++)
{
string text = $"Test{i}";
instanceOfDict.Add(i, text); // This does not work as well
}
}
은 기능성 세라믹 재료 static
방법입니다. instanceOfDict
개인 분야의 클래스로 선언되지 않은 고정되어 있습니다. 당신을 참조 할 수 없습니다 인스턴스를 인스턴스의 수준 구성원(방법,특성,...)에서 정적 방법입니다. 에 읽 static
키워드입니다.
을 만드는 클래스를 선택적으로 노출에는 사전
이후 할 일부 사업 내부에는 클래스,그러나 노출,외부에 갔을 전체 돼지고 만들어 내는 클래스 일반에 대 <TKey, TValue>
그래서 작동하는 것으로 사전의 어떤 유형입니다.
나 또한 그것을 구현하는 컬렉션을 초기화 패턴 할 수 있도록 초기화 클래스의 인스턴스처럼 그는 강력한 소프트웨어입니다.
을 사용하여 컬렉션을 초기화 패턴,반해야 할 것이다:
구현 IEnumerable
나 IEnumerable<T>
(T
될 수 있는 모든 유형 단지 입력할 수집할 수 있습을 던질 NotImplementedException
는 경우 걱정하지 않)
는 방법을 포함처럼 보이는 public void Add (SomeType atLeastOneParameter)
. 할 수 있는 하나 이상의 오버로드 Add
당신이 원하는 경우.
그래서,저는 이것으로 시작(주의를 구현하는 IEnumerable<T>
:
public partial class TestExposedDictionary<TKey, TValue> : IEnumerable<TValue>
{
private readonly Dictionary<TKey, TValue> _theDictionary = new Dictionary<TKey, TValue>();
public void Add(TKey key, TValue value)
{
_theDictionary.Add(key, value);
}
public IEnumerator<TValue> GetEnumerator()
{
foreach (var kvp in _theDictionary)
{
yield return kvp.Value;
}
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}
는 충분한 클래스를 만들려면 대부분처럼 보이 사전에(아마 추가하려는 어떤 방법으로 데이터를 얻을 수있는,등등. 하지만,당신은(당신은 아마이 있고 싶 indexer(에 TKey
고) TryGetValue
.
지만,일 이상의 기능을하는 클래스(이에서 최고 수준의 범위):
public int Count => _theDictionary.Count;
public IEnumerable<KeyValuePair<TKey, TValue>> GetKeyValuePairs()
{
foreach (var kvp in _theDictionary)
{
yield return kvp;
}
}
는 것을 볼 수 있는 방법을 많은 일들이 사전에 당신 항목을 반복하(의 KeyValuePairs
는)사전 컬렉션이 있습니다. 추가하여 주시기 바랍니다.
마지막으로,이를 테스트하...
public static void Test()
{
var testDict = new TestExposedDictionary<int, string> {
{1, "one" },
{5, "five" },
{8, "eight" },
{10, "ten" },
{105, "hundredFive" },
};
// I can call Add in the normal way as well:
testDict.Add(300, "threeHundred");
Console.WriteLine($"TestDict Count: {testDict.Count}");
foreach (string s in testDict)
{
Console.WriteLine(s);
}
}
을 실행할 때 이 코드 얻을:
TestDict Count: 6
one
five
eight
ten
hundredFive
threeHundred
분를 사용하여 이 부분
왜 당신이 사용하고 싶 partial class
. 일반적으로 이행하는 두 개의 덩어리 코드가 있는 편집/에 의해 유지되는 다른 사람들(전형적인 이유는 Visual Studio 의 템플릿 생성/wizarding 메커니즘을 유지하는 한쪽의 partial class
고 프로그래머이다.
이 규칙은 아주 간단합니다,당신은 단순히 선언 public partial class MyClass
에서 두 개의 파일이 있습니다. 두 파일에 있어야 합니다 동일한 프로젝트(즉,컴파일로는 같은 어셈블리)와 클래스에서는 네임스페이스가 있습니다. 이렇게 하면 그냥을 분할(최고 수준의 범위)비트와 조각에서 두 개의 partial class
선언이 있습니다.
이 경우 나는 아마 그것을 나누는 이 방법:
- 나 한 쪽을,나를 넣어 두 가지 기능을 구현하는데 필요한 선언
IEnumerator<TValue>
:
public IEnumerator<TValue> GetEnumerator()
IEnumerator IEnumerable.GetEnumerator()
- 중 하나는,다른 측면을 넣는 것이 좋 다른 모든 것:
- 사전 선언 intialization
- 의 기타 열거자:
public IEnumerable<KeyValuePair<TKey, TValue>> GetKeyValuePairs()
public int Count => _theDictionary.Count;
public void Add(TKey key, TValue value)