2011-07-25 16 views
5

Şu anda kullanıcı çağrılarını içeren bir DAL'yi ve ADO.Net hizmet sağlayıcısına bağlı olarak gerçek çalışmayı yapan bir iç sınıfın varlığını yeniden yapıyorum. SqlProvider ve bunun kod KURU olduğundan emin olmak için çalışıyorum, bu yüzden yapabileceğim bir Func kullanarak ok yaptık:C# çıkış parametresi ile genel temsilci - tanımlayın ve arayın

return RunCommand(c => c.ExecuteNonQuery(commandText, parameters)); 

Ve KomutÇalıştır yöntemi gibi görünür:

private T RunCommand<T>(Func<Commands, T> toRun) 
    { 
     return toRun(CreateCommand()); 
    } 

The CreateCommand() yöntemi, kullanılacak komut nesnesini basitçe kurar, bu da beklenen türden döndüren tüm çağrıları işleyen tek bir yönteme sahip olmamı sağlar. Ben sorun cephesinde birkaç çağrılar Ben bir temsilci kullanabilirsiniz eğer mümkün olmalıdır biliyorum bir out parametre tekrarlanan kodunu kaldırın sağlamalarıdır ama & googling bir sürü sonra ettik deney vb

DataSet DataReader, nasıl yapılacağını öğrenemedim. kodudur: Gerçekten yapmak istiyorum ne

Commands commands = CreateCommand(); 
return commands.ExecuteNonQuery(out cmd, commandText, parameters); 

sesli arama yapabilecek geçerli:

return RunCommand(c => c.ExecuteNonQuery(out cmd, commandText, parameters)); 

Ben mevcut soru this gördüm ama bana süresince ben nasıl çalışamaz bunu ihtiyacım olana dönüştürmek için. Bu temsilci görünüyor

Ben private delegate V TestOutParameter<T, U, V>(T a, out U b, V c); gerekenleri olmak ama bunu çağırmak için var kod sadece doğru değil:

private V RunCommand<T, U, V>(TestOutParameter<Commands, DbCommand, V> commandToExecute) 
    { 
     DbCommand cmd; 
     return (V)commandToExecute(CreateCommand(), out cmd); 
    } 

bu için beni deli edildiği gibi herkes bana yardımcı olabilir hafta!

cevap

11

Temsilcinizin iki yerine üç parametresi vardır. yerine, bunu Func yansıtmak istediğiniz varsayarsak:

private delegate V TestOutParameter<T, U, V>(T a, out U b, V c); 

sahip olmalıdır:

private delegate V TestOutParameter<T, U, V>(T a, out U b); 

Şahsen böyle bir şey için yeniden adlandırmak öneriyoruz:

private delegate TResult FuncOut<T1, T2, TResult>(T1 arg1, out T2 arg2) 
+0

Bu temsilci mükemmelleştirir duygusu, hangi harika. Yine de hala kafamı, onu arama konusunda nasıl ilerlediğimi çiziyorum. T1, gerçek yöntemi çağırmam gereken ve üzerinde çıkış parametresine sahip olan sınıftır. TBH, nasıl çağırılacağı konusunda kayboldum. – Nathan

+0

@Nathan: Temsilci türündeki değişiklik, 'CreateCommand' yöntemi bir' Komutlar 'döndürdüğü sürece, 'RunCommand' kodunuzun hiçbir sorun olmadan derlenmesini sağlamalıdır. –

+0

Bakın başarısız olduğum yer burası :) 'RunCommand' kodu çok mutlu ama ben 'RunCommand (c => c.ExecuteNonQuery (out cmd, commandText, parameters))' i kullanmaya çalıştığımda; VS "ref veya out parametrelerini kullanamaz". Yöntemi çağırmak için doğru sözdizimini kullanmıyorum? – Nathan

İlgili konular