1

クリエイティブな質問があります。依存関係に依存する型に順序を付けたい。:)

例:

public class Oil
{}

public class Seat
{}

public class Wheel : IDependOn<Oil>
{}

public class Car : IDependOn<Wheel>, IDependOn<Seat>
{}

それで、今、インデックスが順序であるDictionary<Int32, Type>場所を返す関数(リフレクションを含む)が必要です。Int32

関数定義は次のようになります。

public Dictionary<Int32, Type> GetOrderedTypes(List<Type> types);

この例の結果は次のようになります。

<1, Oil>
<2, Seat>
<3, Wheel>
<4, Car>

タスクははるかに複雑になる可能性がありますが、ロジックは同じになります。

  • 依存関係のない型の順序は最低です。
  • 同じ依存関係を持つ型の場合、順序は重要ではありません。

この点で誰かが私を助けることができますか?

4

1 に答える 1

3

問題の解決策は次のとおりです。

interface IDependOn<T> { }

class Oil { }

class Seat { }

class Wheel : IDependOn<Oil> { }

class Car : IDependOn<Wheel>, IDependOn<Oil> { }

static class TypeExtensions {

  public static IEnumerable<Type> OrderByDependencies(this IEnumerable<Type> types) {
    if (types == null)
      throw new ArgumentNullException("types");
    var dictionary = types.ToDictionary(t => t, t => GetDependOnTypes(t));
    var list = dictionary
      .Where(kvp => !kvp.Value.Any())
      .Select(kvp => kvp.Key)
      .ToList();
    foreach (var type in list)
      dictionary.Remove(type);
    foreach (var keyValuePair in dictionary.Where(kvp => !kvp.Value.Any())) {
      list.Add(keyValuePair.Key);
      dictionary.Remove(keyValuePair.Key);
    }
    while (dictionary.Count > 0) {
      var type = dictionary.Keys.First();
      Recurse(type, dictionary, list);
    }
    return list;
  }

  static void Recurse(Type type, Dictionary<Type, IEnumerable<Type>> dictionary, List<Type> list) {
    if (!dictionary.ContainsKey(type))
      return;
    foreach (var dependOnType in dictionary[type])
      Recurse(dependOnType, dictionary, list);
    list.Add(type);
    dictionary.Remove(type);
  }

  static IEnumerable<Type> GetDependOnTypes(Type type) {
    return type
      .GetInterfaces()
      .Where(i => i.IsGenericType && i.GetGenericTypeDefinition() == typeof(IDependOn<>))
      .Select(i => i.GetGenericArguments().First());
  }

}

次のような順序付きリストを作成できます。

var orderedList =
  new[] { typeof(Oil), typeof(Seat), typeof(Wheel), typeof(Car) }
    .OrderByDependencies();

キーとしてインデックスを持つ辞書が必要な場合は、順序付きリストから簡単に作成できます。

于 2013-02-13T06:55:55.673 に答える