ada*_*iko 3 c# generics interface
可能是一个简单的问题..
我有一个界面:
public interface ISanitizer
{
T Sanitize<T>(T data_);
}
Run Code Online (Sandbox Code Playgroud)
和一个实现类:
public class BasicFilenameSanitizer : ISanitizer
{
private readonly String m_replacementCharacter = String.Empty;
public BasicFilenameSanitizer(String replacementCharacter_)
{
if (replacementCharacter_ == null)
{
throw new ArgumentNullException("replacementCharacter_");
}
m_replacementCharacter = replacementCharacter_;
}
public virtual T Sanitize<T>(T filename_)
{
if (filename_ == null)
{
throw new ArgumentNullException("filename_");
}
Regex invalidCharacterRegex =
new Regex(String.Format("[{0}]", Regex.Escape(new string(System.IO.Path.GetInvalidFileNameChars()))));
//error occurs here
return Regex.Replace(filename_.ToString(), invalidCharacterRegex.ToString(), m_replacementCharacter);
}
}
Run Code Online (Sandbox Code Playgroud)
在我的特定情况下,以下代码生成了相同的错误:
return (T) someData;
Run Code Online (Sandbox Code Playgroud)
是什么帮助了我 - 使用对象进行双重转换:
例如:
static T MyFunction<T>() {
string s = "test";
if (typeof(T) == typeof(byte[]))
return (T)(object)System.Text.Encoding.ASCII.GetBytes(s);
else if (typeof(T) == typeof(string))
return (T)(object)s;
else throw new Exception();
}
Run Code Online (Sandbox Code Playgroud)
...
var ba = MyFunction<byte[]>();
var bs = MyFunction<string>();
Run Code Online (Sandbox Code Playgroud)
在您的代码中,您string从泛型类型返回 a ,该类型可以是任何类型。
如果您想要通用返回类型,请将您的代码更改为:
public interface ISanitizer<T>
{
T Sanitize(T data_);
}
public class BasicFilenameSanitizer : ISanitizer<string>
Run Code Online (Sandbox Code Playgroud)
如果您只想始终返回 a string,则只需更改方法返回类型:
public interface ISanitizer
{
string Sanitize<T>(T data_);
}
public virtual string Sanitize<T>(T filename_)
Run Code Online (Sandbox Code Playgroud)