Belirli bir kullanım durumunda bir yöntemden anonim bir türü döndürmek aslında mümkündür. Bir bakalım!
C # 7 ile, hafif bir kısıtlama ile gelse de, bir yöntemden anonim türleri döndürmek mümkündür. Yerel işlev adı verilen yeni bir dil özelliğini kullanacağız , bir dolaylama numarasıyla birlikte (başka bir yönlendirme katmanı herhangi bir programlama sorununu çözebilir, değil mi?).
İşte yakın zamanda belirlediğim bir kullanım örneği. Tüm yapılandırma değerlerini şuradan yükledikten sonra günlüğe kaydetmek istiyorumAppSettings
. Neden? Çünkü eksik değerlerle ilgili olarak varsayılan değerlere dönen bazı mantık, biraz ayrıştırma vb. Mantığı uyguladıktan sonra değerleri günlüğe kaydetmenin kolay bir yolu, hepsini bir sınıfa koymak ve bir günlük dosyasına serileştirmektir (log4net kullanarak). Ayrıca ayarlarla uğraşmanın karmaşık mantığını özetlemek ve bunu onlarla yapmam gerekenden ayırmak istiyorum. Bunların hepsi, yalnızca tek bir kullanım için var olan adlandırılmış bir sınıf oluşturmadan!
Anonim bir tür oluşturan yerel bir işlev kullanarak bunun nasıl çözüleceğini görelim.
public static HttpClient CreateHttpClient()
{
// I deal with configuration values in this slightly convoluted way.
// The benefit is encapsulation of logic and we do not need to
// create a class, as we can use an anonymous class.
// The result resembles an expression statement that
// returns a value (similar to expressions in F#)
var config = Invoke(() =>
{
// slightly complex logic with default value
// in case of missing configuration value
// (this is what I want to encapsulate)
int? acquireTokenTimeoutSeconds = null;
if (int.TryParse(ConfigurationManager.AppSettings["AcquireTokenTimeoutSeconds"], out int i))
{
acquireTokenTimeoutSeconds = i;
}
// more complex logic surrounding configuration values ...
// construct the aggregate configuration class as an anonymous type!
var c = new
{
AcquireTokenTimeoutSeconds =
acquireTokenTimeoutSeconds ?? DefaultAcquireTokenTimeoutSeconds,
// ... more properties
};
// log the whole object for monitoring purposes
// (this is also a reason I want encapsulation)
Log.InfoFormat("Config={0}", c);
return c;
});
// use this configuration in any way necessary...
// the rest of the method concerns only the factory,
// i.e. creating the HttpClient with whatever configuration
// in my case this:
return new HttpClient(...);
// local function that enables the above expression
T Invoke<T>(Func<T> func) => func.Invoke();
}
Anonim bir sınıf oluşturmayı başardım ve ayrıca karmaşık ayar yönetimi ile uğraşmanın mantığını CreateHttpClient
kendi "ifadesi" içinde ve içinde özetledim. Bu, OP'nin tam olarak istediği şey olmayabilir, ancak şu anda modern C # ile mümkün olan anonim tiplerle hafif bir yaklaşımdır.