Хорошо, потому что я заметил немного поздно, что вы на самом деле хотели режим ContentFrom, я приложил все усилия, чтобы придумать перевод вашего образца ниже моего исходного ответа
В общем, я использую следующую парадигму для подобных случаев. Найдите и замените ваши конкретные методы здесь и там:)
IEnumerable<T> ValueSources()
{
yield return _value?? _alternative;
yield return SimpleCalculationFromCache();
yield return ComplexCalculation();
yield return PromptUIInputFallback("Please help by entering a value for X:");
}
T EffectiveValue { get { return ValueSources().FirstOrDefault(v => v!=null); } }
Обратите внимание, как теперь вы можете сделать v!=null
произвольно «интересным» для ваших целей.
Обратите внимание также, как ленивая оценка гарантирует, что вычисления никогда не выполняются, когда _value или _alternative установлены на «интересные» значения
Вот моя первая попытка поместить ваш образец в эту форму. Обратите внимание, как я добавил довольно много сантехники, чтобы убедиться, что это на самом деле компилируется в C # exe:
using System.Collections.Generic;
using System.Linq;
using System;
using T=System.String;
namespace X { public class Y
{
public static void Main(string[]args)
{
var content = Sources().FirstOrDefault(c => c); // trick: uses operator bool()
}
internal protected struct Content
{
public T Value;
public ContentFrom Mode;
//
public static implicit operator bool(Content specimen) { return specimen.Mode!=ContentFrom.None && null!=specimen.Value; }
}
private static IEnumerable<Content> Sources()
{
// mock
var Request = new { QueryString = new [] {"id"}.ToDictionary(a => a) };
if (!String.IsNullOrEmpty(Request.QueryString["id"]))
yield return new Content { Value = GetContent(Convert.ToInt64(Request.QueryString["id"])), Mode = ContentFrom.Query };
if (DefaultId != null)
yield return new Content { Value = GetContent((long) DefaultId), Mode = ContentFrom.Default };
yield return new Content();
}
public enum ContentFrom { None, Query, Default };
internal static T GetContent(long id) { return "dummy"; }
internal static readonly long? DefaultId = 42;
} }