簡體   English   中英

創建分層匿名類型

[英]Create hierarchical anonymous type

有沒有辦法創建引用自身實例的匿名類型?

var root = new { Name = "Root", Parent = ??? };
var child = new { Name = "Child", Parent = root };
var childOfChild = new { Name = "Grand child", Parent = child };

例如,我們可以自己引用委托:

Action run = null;
run = () => run();

另一個例子,我們可以創建匿名類型的通用堆棧:

static Stack<T> CreateStack<T>(params T[] values)
{
    var stack = new Stack<T>();

    foreach (var value in values)
        stack.Add(value);

    return stack;
}

你能想到從自己引用匿名類型的任何方法嗎?

C#中的匿名類型是不可變的 因此,所有字段值必須在創建對象之前存在並且永遠不會更改。 因此,在C#中直接循環引用匿名類型是不可能的。

VB中的匿名類型是可變的; 你可能想出一些在VB中做的方法。

可能有一種方法可以使匿名類型間接引用自身,例如,包含一個委托,該委托在被調用時返回匿名類型的實例。 我沒有看到任何方法輕易做到這一點,但我也沒有看到證明這樣做是不可能的。 仔細考慮一下,看看你想出了什么!

我認為這個問題僅用於娛樂目的。 如果你想制作一個圓形參考物體,請做一個名義上的類型。

似乎...... C#編譯器將拒絕遞歸地推斷類型。 以此示例代碼為例:

(來自@Eric:正確;類型推理引擎要求在推斷出“輸出”類型的lambda之前知道lambda的所有“輸入”類型)

public void Run()
{
  var k = Generator((str, parent) => new {
    Name = str,
    Parent = parent
  });
}

public Func<string, T, T> Generator<T>(Func<string, T, T> generator)
{
  return (str, obj) => generator(str, obj);
}

這段代碼無法編譯,錯誤是編譯器無法推斷<T>Generator<T>一起使用...因此我認為這是不可能的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM