型クラスを変数に割り当てる方法を理解しています:
Type type = ("System.Security.AccessControl.FileSecurity").GetType();
この変数を、既にインスタンス化されたオブジェクトの参照として使用するにはどうすればよいでしょうか?
次のことを試してみると:
type instance = new SomeOtherType();
次のエラー コードが表示されます。
型または名前空間名 'type' が見つかりませんでした (using ディレクティブまたはアセンブリ参照がありませんか?)
例:
FileSecurity fSecurity = fInfo.GetAccessControl();
私はできるようにしたい:
Type sometype = ("System.Security.AccessControl.FileSecurity").GetType();
sometype mynewtype = fInfo.GetAccessControl();
編集: そもそもなぜ私がこれをやろうとしているのかをよりよく説明するために、このコードを見てください:
public static class FileFolderPermissions
{
public static void SetFileFolderPermissions()
{
try
{
DirectoryInfo dInfo = new DirectoryInfo(@"D:\SomeFolder");
DirectorySecurity dSecurity = dInfo.GetAccessControl();
FileInfo fInfo = new FileInfo(@"D:\Test.txt");
FileSecurity fSecurity = fInfo.GetAccessControl();
dSecurity.AddAccessRule(new FileSystemAccessRule("TestAccount",
FileSystemRights.FullControl, InheritanceFlags.ObjectInherit | InheritanceFlags.ContainerInherit,
PropagationFlags.NoPropagateInherit, AccessControlType.Allow));
dInfo.SetAccessControl(dSecurity);
fSecurity.AddAccessRule(new FileSystemAccessRule("TestAccount",
FileSystemRights.FullControl, AccessControlType.Allow));
fInfo.SetAccessControl(fSecurity);
}
catch
{
Console.WriteLine("Error.");
}
}
}
私がやろうとしているのは、オブジェクトがファイルであるかディレクトリであるかに ACL を設定する一般的な方法を作成することです。ご覧のとおり、上記のコードには多くのコードの重複があります。したがって、「DirectoryInfo」または「FileInfo」のいずれかを上記のコードに一般的に渡す方法を見つけようとしてきたので、すべての重複はありません。
Type を変数に保存できることに遭遇しました。しかし、私が見た Activator を扱った例のほとんどは、オブジェクトのインスタンスの作成に関係していました。
ご覧のとおり、これはインスタンスを作成していません。これが、「FileSecurity/DirectorySecurity fSecurity/dSecurity 部分を一般化する方法」と考えていた理由です。
ご協力いただきありがとうございます。
解決策 : nawfal によって提供された回答に基づいて、Main メソッドのコードと共に FileInfo と DirectoryInfo の両方で機能するようになった更新されたクラスを次に示します。注: 例外をまだ実装していないため、例外のスローに関するセクションをコメントアウトしました。
public static class DynFileFolderPermissions
{
public static void SetFileFolderPermissions(dynamic info, FileSystemAccessRule FileAccessRule)
{
// if (!(info is System.IO.FileInfo) || !(info is System.IO.DirectoryInfo))
// throw new System.InvalidOperationException("Incorrect Type.");
try
{
var security = info.GetAccessControl();
security.AddAccessRule(FileAccessRule);
info.SetAccessControl(security);
}
catch
{
Console.WriteLine("Error.");
}
}
}
// Main
class Program
{
static void Main(string[] args)
{
// Grants FullControl to user "TestUser" on file D:\Test.txt
var fileInfo = new FileInfo(@"D:\Test.txt");
var FileAccessRule = new FileSystemAccessRule("TestUser", FileSystemRights.FullControl, AccessControlType.Allow);
DynFileFolderPermissions.SetFileFolderPermissions(fileInfo, FileAccessRule);
// Grants FullControl to user "TestUser" on directory D:\Test
var directoryInfo = new DirectoryInfo(@"D:\Test");
var DirectoryAccessRule = new FileSystemAccessRule("TestUser", FileSystemRights.FullControl,
InheritanceFlags.ObjectInherit | InheritanceFlags.ContainerInherit,
PropagationFlags.None, AccessControlType.Allow);
DynFileFolderPermissions.SetFileFolderPermissions(directoryInfo, DirectoryAccessRule);
}
}