2016-03-08 66 views
0

我有一個類似於下面的方法,我想用輸入字符串設置它的值。通用類型的方法,設置值

我該怎麼辦呢?任何意見,將不勝感激

private static void QueueCheckNAdd<T>(ref T param, string input) 
    { 
     param.DoSomethingLikeSetValue(input); 
    } 

供您參考,泛型類型是像int或雙

+1

如果'T'只會是'int'或'double',您可能希望只寫了幾個具體的方法來執行使用'int.Parse()'和'double.Parse轉換()'。如果只能使用一組固定的小類,那麼你的方法並不是真正的通用方法。使用具體的方法也可以讓你編寫沒有強制轉換的方法。 – antiduh

+0

附註:沒有真正好的方法來限制泛型類型爲'int' /'double' - 所以如果您正在編寫可能使用的代碼,您需要驗證它是否可以與所有允許的類型一起使用.... –

+0

我想考慮有一天我可能不得不適應不同的類型。我的意思是,現在它的唯一分配給int和double的數據類型爲 – CJC

回答

1
param = (T)(object)Convert.ChangeType(input, typeof(T)); 

的強制轉換有必要說服編譯器,結果真的T型。

+0

我明白了。非常感謝你 – CJC

2

你想param是通用的(即任何類型),你希望能夠調用一些方法,是否正確?那麼,您可以在那裏看到問題:如果param可以是任何類型,則無法保證它將具有方法DoSomethingLikeSetValue(或其他)。我相信你可以通過自省或運行時類型強制來想象,但我認爲完成你要找的東西的「乾淨」方式是將T的類型約束爲某些具有所需方法的接口(DoSomethingLikeSetValue)。就像這樣:

private static void QueueCheckNAdd<T>(ref T param, string input) where T : IHasSomething { 
    param.DoSomethingLikeSetValue(input); 
} 

public interface IHasSomething { 
    void DoSomethingLikeSetValue(string s); 
} 

然後你就可以調用QueueCheckNAdd一般只有在泛型類型支持IHasSomething接口。所以,你可以使用這樣的:

public class Foo : IHasSomething { 
    public void DoSomethingLikeSetValue(string s) { 
     Console.WriteLine(s); 
    } 
} 

var f = new Foo(); 
QueueCheckNAdd<Foo>(f, "hello"); 
+0

雖然很好的建議,你不能真正做到內置的類型,因爲你不能添加接口到現有的類型... –

+0

這是真的,阿列克謝......並提出了問題「如果你可以'不要這樣做,你應該這樣做嗎?「在一天結束時,如果類型安全帶來巨大的不便,那麼您應該考慮使用無類型的語言。是的,這個問題可以通過RTTI或其他方法解決,但是這對我來說有一個更大的架構問題。 –

+0

這也是一個非常好的方法,我會牢記這一點。但我會和SLaks的答案一起去,因爲它更清潔。雖然性能可能會更慢 – CJC

1

良好做法是使用界面像之前描述的那樣,

但是如果你想要一些樂趣,你可以ASLO使用對象作爲一個動態的對象,像下面:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace ConsoleApplication1 
{ 
    class SMTHG 
    { 
     public void DoSomethingLikeSetValue(string input) 
     { 
      Console.WriteLine("HEYYYYY!!! DYNAMIC OBJECTS FTW!...\n" + input); 
     } 
    } 
    class Program 
    { 
     private static void QueueCheckNAdd<T>(ref T param, string input) 
     { 
      dynamic dynamicObject = (dynamic)param; 
      dynamicObject.DoSomethingLikeSetValue(input); 
     } 
     static void Main(string[] args) 
     { 
      SMTHG smthg = new SMTHG(); 
      QueueCheckNAdd(ref smthg, "yoyuyoyo"); 
     } 
    } 
} 
+0

謝謝,有趣 – CJC