我有一個類似於下面的方法,我想用輸入字符串設置它的值。通用類型的方法,設置值
我該怎麼辦呢?任何意見,將不勝感激
private static void QueueCheckNAdd<T>(ref T param, string input)
{
param.DoSomethingLikeSetValue(input);
}
供您參考,泛型類型是像int或雙
我有一個類似於下面的方法,我想用輸入字符串設置它的值。通用類型的方法,設置值
我該怎麼辦呢?任何意見,將不勝感激
private static void QueueCheckNAdd<T>(ref T param, string input)
{
param.DoSomethingLikeSetValue(input);
}
供您參考,泛型類型是像int或雙
你想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");
雖然很好的建議,你不能真正做到內置的類型,因爲你不能添加接口到現有的類型... –
這是真的,阿列克謝......並提出了問題「如果你可以'不要這樣做,你應該這樣做嗎?「在一天結束時,如果類型安全帶來巨大的不便,那麼您應該考慮使用無類型的語言。是的,這個問題可以通過RTTI或其他方法解決,但是這對我來說有一個更大的架構問題。 –
這也是一個非常好的方法,我會牢記這一點。但我會和SLaks的答案一起去,因爲它更清潔。雖然性能可能會更慢 – CJC
良好做法是使用界面像之前描述的那樣,
但是如果你想要一些樂趣,你可以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");
}
}
}
謝謝,有趣 – CJC
如果'T'只會是'int'或'double',您可能希望只寫了幾個具體的方法來執行使用'int.Parse()'和'double.Parse轉換()'。如果只能使用一組固定的小類,那麼你的方法並不是真正的通用方法。使用具體的方法也可以讓你編寫沒有強制轉換的方法。 – antiduh
附註:沒有真正好的方法來限制泛型類型爲'int' /'double' - 所以如果您正在編寫可能使用的代碼,您需要驗證它是否可以與所有允許的類型一起使用.... –
我想考慮有一天我可能不得不適應不同的類型。我的意思是,現在它的唯一分配給int和double的數據類型爲 – CJC